프로그래밍/JDBC

04 JDBC : Service 사용

pupu91 2022. 8. 29. 19:00
반응형

* 앞의 내용 정리

 

connection
class.forname() 오라클 드라이버 등록(라이브러리 추가 후 )
DriverMager.getConnection(url, user, password) ->properties 파일로 따로 뺄때는 (user.prop)
preparedStatement 설정

sql문 생성
pstmt = conn.prepareStatement(query); 
pstmt.setxxx(1, ____); 

 sql문 실행(세팅한 쿼리문 실행시키는 코드)
pstmt.executeQuery() = select / 반환값 resultset  
pstmt.executeUpdate() =  iud / int값(삽입된, 수정된,  삭제된 행의 개수)
: 컬럼에있는 정보들을 각각의 데이터 타입으로 꺼내서 자바의 객체(dto에 설정한 set)에 옮겨주기


MVC 
 Model :service/ dao
 View  : 사용자에게 보여지는 화면 , html 
 Controller


**server - controller, service, dao **
요청과 응답
controller(req.res) //서블릿으로
사용자 요청에 일어난 파라미터를 꺼내서 처리 
↑↓
service 
transaction 제어가 목적
↑↓
DAO
data, access, object
데이터 쪽에 접근,  db와 직접적으로 연결하는 코드를 씀


 

Service의 역할

1. Connection 생성

2. DAO의 메소드 호출 - 하나일수도 여러개일수도 있음

3. 트랜잭션의 제어(commit, rollback)

   : 메소드 호출을 다해서 결과값을 받았을 때 잘 수행되었지 확인해서 commit 또는 rollback 실행

4. Connection 닫기

 

 


 

* 신규 카테고리 등록 후 해당 카테고리 코드를 참조하는 신규 메뉴 등록 기능 작성해보기 * 

 

 

 

  • 드라이버 등록 템플릿 만들기

 

 

 

 

 

  • 쿼리문 작성하기

 

 

 

  • 카테고리와 메뉴 DTO 작성


 

 

Service

public class MenuService {
	public void registNewMenu() {
   		
        1. Connection 생성
        Connection conn = getConnection();
        
        2. DAO 메소드 호출 : 기능에 따라 1번 이상의 호출이 일어날 수 있음
        MenuDAO menuDAO = new MenuDAO();
        
        1) 신규 카테고리 등록
        CategoryDTO newCategory = new CategoryDTO();
        newCategory.setName("기타");
        newCategory.setRefCateforyCode(null);
        
        신규 카테고리에 대한 기능 호출
        (DAO insertNewCategory메소드에서 사용할 conn, newCategory를 전달해주기)
        int result = menuDAO.insertNewCategory(conn, newCategory)
        
        방금 insert 된 마지막 카테고리 번호 조회
        int newCategoryCode = menuDAO.slectLastCatetoryCode(conn);
        =>조회에 있어서 조건이 없기 때문에 conn만 전달
        
        2) 신규 메뉴 등록
        MenuDTO newMenu = new MenuDTO();
        newMenu.setName("메롱메롱스튜");
        newMenu.setPrice(40000);
        newMenu.setCategoryCode(newCategoryCode); 위에서 알아온 카테고리 코드 사용
        newMenu.setOrderableStatus("Y");
        
        int result2 = menuDAO.insertNewMenu(conn, newMenu);
       	
        3. 트랜잭션 제어 
        if(result1 > 0 && result2 > 0) {
       		 System.out.println("신규 카테고리와 ㅁㅔ뉴를 추가하였습니다.");
			 commit(conn);
        } else {
			System.out.println("신규 카테고리와 메뉴를 추가하지 못했습니다.");
			rollback(conn);
		}
       
        4. Connection 닫기
        close(conn);
    }
  }

 

 

 

 

 

MENU DAO 작성

public class MenuDAO {
	prop은 메소드 공통으로 사용되기 때문에 필드에 미리 선언
    private Properties prop = new Properties();
    
    1) MenuDAO 생성자에 XML 파일 불러오기
    public MenuDAO(){
      
      try {
			prop.loadFromXML(new FileInputStream("mapper/menu-query.xml"));
		
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
   
   
   2) 신규 카테고리 등록용 매소드
    public int insertNewCategory(Connection conn, CategoryDTO newCategory){
    	
        PreparedStatement pstmt = null;
        int result = 0;
        String query = prop.getProperty("insertCategory");
        
        try{
        	pstmt = conn.prepareStatement(query);
            pstmt.setString(1, newCtegory.getName());
            pstmt.setObgeject(2, newCategory.getRefCategoryCode()); 객체이기 때문에 integer가 아닌 obfect로 
        	
            result = pstmt.executeUpdate();
            
    		} catch (SQLException e) {
			e.printStackTrace();
			} finally {
			close(pstmt);
			}
		
			return result;
	}
   
       
       3) 방금 insert 된 마지막 카테고리 번호 조회히기 위한 메소드
       public int slectLastCatetoryCode(Connection conn) {
       
       		PreparedStatement pstmt = null;
            ReseltSet rset = null;
            int newCategorycode = 0;
            String query = prop.getProperty("getCurrentSequence");
            
            try{
            	pstmt = conn.prepareStatement(query);
                
                위치홀더가 없으니 바로 실행
                rest = pstmt.executeQuery();
                
                if(rset.next()) {
                	newCategoryCode = rset.getInt("CURRVAL"); 
                    => CURRVAL라는 컬럼을 int 값으로 가져와서 newCategoryCode에 넣음
                }
            
        } catch (SQLException e) {
			e.printStackTrace();
		}finally{
			close(rset);
			close(pstmt);
		}
		
		return newCategoryCode;
	}
 
 		
       4) 신규 메뉴 등록을 위한 메소드
          
          public int insertNewMenu(Connection conn, MenuDTO newMenu){
       
       	    PreparedStatement pstmt = null;
            int result = 0;
            String query = prop.getProperty("insertMenu");
            
            try {
            	pstmt = conn.prepareStatement(query);
                pstmt.setString(1, newMenu.getName());
                pstmt.setInt(2, newMenu.getPrice());
				pstmt.setInt(3, newMenu.getCategoryCode());
				pstmt.setString(4, newMenu.getOrderableStatus());
                
                result = pstmt.executeUpdate();
	
               } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    close(pstmt);
                }

                return result;
		
	}

}

 

 

반응형