ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 4. 서블릿 비즈니스 로직 추가
    개발자 수업/JSP 2021. 11. 25. 12:21

    1. 서블릿의 비즈니스 로직 처리 작업
        1) 서블릿이 클라이언트로부터 요청을 받으면 그 요청에 대해 수행을 하는 것
        2) 대부분의 비즈니스 처리 작업은 데이터베이스 연동 관련 작업, 그 외에 다른 서버와 연동해서 데이터를 얻는 작업도 수행
        3) 서블릿의 가장 핵심 기능

     

    2. 서블릿의 비즈니스 처리 예
        1) 웹 사이트 회원 가입 요청 처리 작업
        2) 웹 사이트 로그인 요청 처리 작업
        3) 쇼핑몰 상품 주문 처리 작업

    3. 서블릿의 비즈니스 처리 과정
        1) 클라이언트로부터 요청을 받음
        2) 데이터베이스 연동과 같은 비즈니스 로직을 처리함
        3) 처리 결과를 클라이언트에게 돌려줌
       

    4. 서블릿의 데이터베이스 연동하기
        1) 서블릿, DAO(Data Access Object), VO(Value Object), DB
        2) 순서
            - 웹 브라우저가 서블릿에게 회원 정보 요청함
            - MemberServlet은 요청을 받음
              MemberDAO 객체를 생성한 후 listMembers() 메서드를 호출함
            - listMembers()에서 connDB() 메서드로 데이터베이스와 연결 후 SQL문 실행함
            - 조회된 회원 정보를 MemberVO 속성에 설정한 후 ArrayList에 저장함
            - ArrayList의 MemberVO를 차례대로 가져와 회원 정보를 HTML 태그 문자열로 만듦
            - 만들어진 HTML 태그를 웹 브라우저로 전송함

    //서블릿
    
    package kr.co.ezenac.member;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.sql.Date;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/member")
    public class MemberServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		MemberDAO dao = new MemberDAO();				//SQL문으로 조회할 MemberDAO 객체를 생성함
    		List<MemberVO> list = dao.listMembers();		//listMembers() 메서드로 회원 정보를 조회함
    		
    		out.print("<html><body>");
    		
    		out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
    		out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td></tr>");
    		
    		for(int i=0; i<list.size(); i++) {
    			MemberVO memberVO = list.get(i);			//조회한 회원 정보를 for문 <tr>태그 이용해 출력함
    			String id = memberVO.getId();
    			String pwd = memberVO.getPwd();
    			String name = memberVO.getName();
    			String email = memberVO.getEmail();
    			Date joinDate = memberVO.getJoinDate();
    			out.print("<tr><td>" + id + "</td><td>"
    								 + pwd + "</td><td>"
    								 + name + "</td><td>"
    								 + email + "</td><td>"
    								 + joinDate + "</td></tr>");
    		}
    		
    		out.print("</table></body></html>");
    	}
    
    }
    //DAO 클래스
    
    package kr.co.ezenac.member;
    
    import java.sql.Connection;
    import java.sql.Date;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    
    public class MemberDAO {
    	private static final String driver = "oracle.jdbc.driver.OracleDriver";
    	private static final String url = "jdbc:oracle:thin:@localhost:1521:XE";
    	private static final String user = "wdsql";
    	private static final String pwd = "0311";
    	
    	private Connection conn;
    	private Statement stmt;
    	
    	public void connDB() {
    		try {
    			Class.forName(driver);
    			System.out.println("Oracle 드라이버 로딩 성공");
    			
    			conn = DriverManager.getConnection(url, user, pwd);
    			System.out.println("Connection 생성 성공");
    			
    			stmt = conn.createStatement();
    			System.out.println("Statement 생성 성공");
    			
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	public List<MemberVO> listMembers() {
    		List<MemberVO> list = new ArrayList<MemberVO>();
    		
    		connDB();		//네 가지 정보로 DB를 연결함 
    		
    		String query = "SELECT * FROM T_MEMBER";
    		System.out.println(query);
    		
    		try {
    			ResultSet rs = stmt.executeQuery(query);	//SQL문으로 회원 저옵를 조회함
    			
    			while(rs.next()) {
    				String id = rs.getString("id");
    				String pwd = rs.getString("pwd");
    				String name = rs.getString("name");
    				String email = rs.getString("email");
    				Date joinDate = rs.getDate("joinDate");	//조회한 레코드의 각 컬럼 값을 받아옴
    				
    				MemberVO vo = new MemberVO();
    				vo.setId(id);
    				vo.setPwd(pwd);
    				vo.setName(name);
    				vo.setEmail(email);
    				vo.setJoinDate(joinDate);				//각 컬럼 값을 다시 MemberVO 객체의 속성에 설정함
    				
    				list.add(vo);							//설정된 MemberVO 객체를 다시 ArrayList에 저장함
    			}
    			
    			rs.close();
    			stmt.close();
    			conn.close();
    			
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		return list;									//조회한 레코드의 개수만큼 MemberVO 객체를 저장한 ArrayList를 반환함
    	}
    	
    }

     

    //VO 클래스
    
    package kr.co.ezenac.member;
    
    import java.sql.Date;
    
    /*
     	id 			varchar2(10)	PRIMARY KEY,
    	pwd			varchar2(10)	NOT NULL,
    	name		varchar2(50),
    	email		varchar2(50),
    	joinDate	DATE			DEFAULT sysdate
     */
    
    public class MemberVO {
    	private String id;
    	private String pwd;
    	private String name;
    	private String email;
    	private Date joinDate;
    	
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    	public String getPwd() {
    		return pwd;
    	}
    	public void setPwd(String pwd) {
    		this.pwd = pwd;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getEmail() {
    		return email;
    	}
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	public Date getJoinDate() {
    		return joinDate;
    	}
    	public void setJoinDate(Date joinDate) {
    		this.joinDate = joinDate;
    	}
    	
    	
    }
    //DB
    -- 회원 테이블 생성
    DROP TABLE t_member CASCADE CONSTRAINTS;
    CREATE TABLE t_member(
    	id 			varchar2(10)	PRIMARY KEY,
    	pwd			varchar2(10)	NOT NULL,
    	name		varchar2(50),
    	email		varchar2(50),
    	joinDate	DATE			DEFAULT sysdate
    );
    
    -- 회원 정보 추가
    INSERT INTO T_MEMBER
    VALUES ('lee', '0311', '이순신', 'lee@gmail.com', sysdate);
    
    INSERT INTO T_MEMBER
    VALUES ('hong', '0311', '홍길동', 'hong@gmail.com', sysdate);
    
    INSERT INTO T_MEMBER
    VALUES ('shin', '0311', '신사임당', 'shin@gmail.com', sysdate);
    
    COMMIT;
    
    SELECT * FROM T_MEMBER;



        3) PreparedStatement를 이용해 회원 정보 조회
            - PreparedStatement 인터페이스 특징
                - Statement 상속하므로 지금까지 사용한 메서드를 그대로 사용함
                - 성능 향상시킴
                - SQL문 '?'를 넣을 수 있으므로 '?'의 값만 바꾸어 손쉽게 설정가능

    //서블릿
    
    package kr.co.ezenac.member02;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.sql.Date;
    import java.util.List;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    
    @WebServlet("/member")
    public class MemberServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html;charset=utf-8");
    		PrintWriter out = response.getWriter();
    		
    		MemberDAO dao = new MemberDAO();				//SQL문으로 조회할 MemberDAO 객체를 생성함
    		List<MemberVO> list = dao.listMembers();		//listMembers() 메서드로 회원 정보를 조회함
    		
    		out.print("<html><body>");
    		
    		out.print("<table border=1><tr align='center' bgcolor='lightgreen'>");
    		out.print("<td>아이디</td><td>비밀번호</td><td>이름</td><td>이메일</td><td>가입일</td></tr>");
    		
    		for(int i=0; i<list.size(); i++) {
    			MemberVO memberVO = list.get(i);			//조회한 회원 정보를 for문 <tr>태그 이용해 출력함
    			String id = memberVO.getId();
    			String pwd = memberVO.getPwd();
    			String name = memberVO.getName();
    			String email = memberVO.getEmail();
    			Date joinDate = memberVO.getJoinDate();
    			out.print("<tr><td>" + id + "</td><td>"
    								 + pwd + "</td><td>"
    								 + name + "</td><td>"
    								 + email + "</td><td>"
    								 + joinDate + "</td></tr>");
    		}
    		
    		out.print("</table></body></html>");
    	}
    
    }
    //DAO 클래스
    
    package kr.co.ezenac.member02;
    
    import java.sql.Connection;
    import java.sql.Date;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    import java.util.List;
    
    public class MemberDAO {
    	private static final String driver = "oracle.jdbc.driver.OracleDriver";
    	private static final String url = "jdbc:oracle:thin:@localhost:1521:XE";
    	private static final String user = "wdsql";
    	private static final String pwd = "0311";
    	
    	private Connection conn;
    	private PreparedStatement pstmt;
    	
    	public void connDB() {
    		try {
    			Class.forName(driver);
    			System.out.println("Oracle 드라이버 로딩 성공");
    			
    			conn = DriverManager.getConnection(url, user, pwd);
    			System.out.println("Connection 생성 성공");
    			
    			
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	public List<MemberVO> listMembers() {
    		List<MemberVO> list = new ArrayList<MemberVO>();
    		
    		connDB();		//네 가지 정보로 DB를 연결함 
    		
    		String query = "SELECT * FROM T_MEMBER";
    		System.out.println(query);
    		
    		try {
    			
    			pstmt = conn.prepareStatement(query);	//prepareStatement()메서드에 SQL문을 전달해 객체 생성함
    			ResultSet rs = pstmt.executeQuery();	//미리 설정한 SQL문을 실행함
    			
    			while(rs.next()) {
    				String id = rs.getString("id");
    				String pwd = rs.getString("pwd");
    				String name = rs.getString("name");
    				String email = rs.getString("email");
    				Date joinDate = rs.getDate("joinDate");	//조회한 레코드의 각 컬럼 값을 받아옴
    				
    				MemberVO vo = new MemberVO();
    				vo.setId(id);
    				vo.setPwd(pwd);
    				vo.setName(name);
    				vo.setEmail(email);
    				vo.setJoinDate(joinDate);				//각 컬럼 값을 다시 MemberVO 객체의 속성에 설정함
    				
    				list.add(vo);							//설정된 MemberVO 객체를 다시 ArrayList에 저장함
    			}
    			
    			rs.close();
    			pstmt.close();
    			conn.close();
    			
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		return list;									//조회한 레코드의 개수만큼 MemberVO 객체를 저장한 ArrayList를 반환함
    	}
    	
    }
    //VO 클래스
    
    package kr.co.ezenac.member02;
    
    import java.sql.Date;
    
    /*
     	id 			varchar2(10)	PRIMARY KEY,
    	pwd			varchar2(10)	NOT NULL,
    	name		varchar2(50),
    	email		varchar2(50),
    	joinDate	DATE			DEFAULT sysdate
     */
    
    public class MemberVO {
    	private String id;
    	private String pwd;
    	private String name;
    	private String email;
    	private Date joinDate;
    	
    	public String getId() {
    		return id;
    	}
    	public void setId(String id) {
    		this.id = id;
    	}
    	public String getPwd() {
    		return pwd;
    	}
    	public void setPwd(String pwd) {
    		this.pwd = pwd;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getEmail() {
    		return email;
    	}
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	public Date getJoinDate() {
    		return joinDate;
    	}
    	public void setJoinDate(Date joinDate) {
    		this.joinDate = joinDate;
    	}
    }
    //DB
    -- 회원 테이블 생성
    DROP TABLE t_member CASCADE CONSTRAINTS;
    CREATE TABLE t_member(
    	id 			varchar2(10)	PRIMARY KEY,
    	pwd			varchar2(10)	NOT NULL,
    	name		varchar2(50),
    	email		varchar2(50),
    	joinDate	DATE			DEFAULT sysdate
    );
    
    -- 회원 정보 추가
    INSERT INTO T_MEMBER
    VALUES ('lee', '0311', '이순신', 'lee@gmail.com', sysdate);
    
    INSERT INTO T_MEMBER
    VALUES ('hong', '0311', '홍길동', 'hong@gmail.com', sysdate);
    
    INSERT INTO T_MEMBER
    VALUES ('shin', '0311', '신사임당', 'shin@gmail.com', sysdate);
    
    COMMIT;
    
    SELECT * FROM T_MEMBER;


     



    5. DataSource 이용한 데이터베이스 연동
        1) ConnectionPool 등장배경
            - 애플리케이션에서 DB 연결과정에 시간이 많이 걸림 (기존 연동 방법 문제점)
              --> 미리 Connection 객체를 생성한 후, 미리 데이터베이스와 연결을 맺음
                  애플리케이션은 DB 연동 작업 발생 시 Connection 객체를 이용해서 작업함
        2) JNDI (Java Naming and Directory Interface)
            - 필요한 자원을 키/값(key/value) 쌍으로 저장한 후 필요할 때 키를 이용해 값을 얻는 방법
            - 커넥션풀에 적용
                - 톰캣 컨테이너가 ConnectionPool 객체를 생성하면 이 객체에 대한 JNDI 이름(key)을 미리 설정해 놓음
                - 그러면 웹 애플리케이션에서 DB와 연동 작업할 때 이 JNDI 이름(key)으로 접근하여 작업을 수행함
        3) 이클립스에서 톰캣 DataSource 설정
            - Context.xml 파일에 <Resource> 태그를 이용해 톰캣 실행 시 연결할 DB를 설정
             <Resource 
                name="jdbc/oracle"      --> DataSource에 대한 JNDI 이름
                auth="Container"        --> 인증 주체
                type="javax.sql.DataSource"
                driverClassName="oracle.jdbc.driver.OracleDriver"
                url="jdbc:oracle:thin:@localhost:1521:XE"
                username="wdsql"
                password="0311"
                maxActive="50"          --> 동시에 최대로 DB에 연결할 수 있는 Connection 수
                maxWait="-1"            --> 동시에 idle 상태로 대기할 수 있는 최대 시간
            />

    '개발자 수업 > JSP' 카테고리의 다른 글

    6. 회원정보 등록, 삭제하기  (0) 2021.11.27
    5. JDBC 연동과 관련객체  (0) 2021.11.27
    3. 서블릿  (0) 2021.11.24
    2. 웹 애플리케이션과 서블릿 이해  (0) 2021.11.24
    1. 웹 프로그래밍 소개  (0) 2021.11.22

    댓글