[37일 차] : JDBC_MVC패턴 적용(3)_ Service⭕

서하루·2022년 12월 5일
0

(3) JDBC 공부기록

목록 보기
4/5

💡 MVC패턴 Service


우리는 기존에 View에서 요청하여 Controller 클래스에 전달하고 Dao로 호출하여 DB에 접속하고 sql구문을 실행한 결과를 다시 Controller 클래스로 리턴하여 그 결과에 따른 사용자제공화면을 View에서 결정하고 출력하는 시스템으로 진행했다.

➡️ 그럼 Service를 사용하는 이유는 무엇일까?

Dao 클래스에서 하는 일이 너무 많고 중복되는 코드의 수를 줄이고자 Controller에서 Service로 전달값을 호출하여 원래 Dao클래스에서 진행했던 Connection 객체 생성과 트랜잭션 처리를 서비스 클래스에서 진행한다. 즉, Dao가 DB에서 받아온 데이터를 전달받아 가공하는 역할이다.


또한, 중복되는 코드의 수를 줄이고자 공통 템플릿을 생성한다. 매번 반복적으로 작성될 코드를 메소드로 정의하여 한줄의 코드로 줄일 수 있다. 매번 작성하는 Connection 객체 생성 후 반환 메소드, commit 처리메소드, rollback 처리메소드, Connection 객체전달받은 후 반납 메소드, Statement 관련 객체 전달받아 반납메소드, ResultSet 객체 전달받아 반납메소드 등을 이 클래스에 정의한 후, Service 클래스와 Dao 클래스 해당 템플릿 클래스 import구문에 stactic ~~~ .* 을 추가하면 클래스명을 제외하고 호출할 수 있다.


💡 Service 클래스 O

회원 추가(insert)

// Controller 클래스

public class MemberController {

	
	public void insertMember(String userId, String userPwd, String userName,
							 String gender, String age, String email, 
							 String phone, String address, String hobby) {
		

		Member m = new Member(userId, userPwd, userName, gender, Integer.parseInt(age), email, phone, address, hobby);
	
		int result = new MemberService().insertMember(m);
	
		if(result > 0) {
			new MemberMenu().displaySuccess("성공적으로 회원추가됐습니다.");
		}else {
			new MemberMenu().displayFail("회원추가에 실패했습니다.");
		}
	}

Member 객체를 생성하고 Service클래스로 member객체와 함께 전달한다.

// Service 클래스

public class MemberService {

	public int insertMember(Member m) {
    
    Connection conn = getConnection();
    int result = new MemberDao().insertMember(conn, m);
		
		if(result > 0) {
        commit(conn);
		}else {
			rollback(conn);
		}
        close(conn);
        
       }
       return result;
       
       

전달받은 result를 가공처리 후 Dao 클래스로 전달 !conn객체도 함께!

Dao 클래스

public class MemberDao {
	
	public int insertMember(Connection conn, Member m) {
	int result = 0;
		PreparedStatement pstmt = null;
		String sql = "INSERT INTO MEMBER VALUES(SEQ_USERNO.NEXTVAL, ?, ?, ?, ?, ?, ?, ?, ?, ?, SYSDATE)";
        try {
			pstmt = conn.prepareStatement(sql);

			pstmt.setString(1, m.getUserId());
			pstmt.setString(2, m.getUserPwd());
			pstmt.setString(3, m.getUserName());
			pstmt.setString(4, m.getGender());
			pstmt.setInt(5, m.getAge());
			pstmt.setString(6, m.getEmail());
			pstmt.setString(7, m.getPhone());
			pstmt.setString(8, m.getAddress());
			pstmt.setString(9, m.getHobby());

			result = pstmt.executeUpdate();

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
        close(pstmt);
        return result;
	}
  • mvc 패턴 흐름 이해하기
  1. View 클래스에서 사용자에게 보여질 화면 및 해당 메뉴 프로그램 호출 및 입출력 코드 작성
  2. Controller 클래스에서 view단의 요청 처리 후, Service 클래스로 전달
  3. Service 클래스에서 jdbc driver, Connection객체생성 처리 후 Dao 클래스로 전달
  4. Dao 클래스는 전달받은 객체를 통해 DB와 연결하여 sql문 실행 및 해당 결과를 받고 그 결과를 return
  5. return받은 결과를 가지고 Service 클래스에서 트랜잭션 처리 및 남은 자원반납을 처리한 후, 결과가 Controller로 리턴
  6. Service로부터 반환받은 결과에 따라 사용자가 보게될 화면 View 결정(출력문x)
  7. Controller로 부터 호출된 view 결과에 따라 사용자가 보게될 화면 출력문 입력

💡 공통 템플릿

매번 반복적으로 작성될 코드를 메소드로 정의하여 코드의 수를 줄일 수 있다.

  1. Connection 객체 생성 메소드
  1. commit 처리 메소드
  1. rollback 처리 메소드
  1. Connection 객체 반납 메소드
  1. Statement 객체 반납 메소드
  1. ResultSet 객체 반납메소드

모든 클래스를 static으로 정의하여 사용할 클래스의 import구문에 static을 추가하면 클래스명 없이 객체만으로 호출이 가능하다.


또한, 트랜잭션 처리 및 자원 반납의 경우 기존의 간단한 코드보다는 nullpointexception이 발생할 수 있기에 정확한 조건처리를 하여 코드를 작성하는것이 옳은 방법이다 !

0개의 댓글