9월 20일 D+39 [JSP13장 : 웹 어플리케이션 구조]
* LogonDBBean에서 getConnection() 메소드를 따로 만들었을 때 : getConnection()을 쓰는 다른 객체들을 함께 그룹핑하기 불가능
JSP만을 이용하는 경우의 문제
* 동일한 로직을 수행하는 코드가 중복될 가능성이 높음
* 문제점 : 기능 변경 발생 시 여러 코드에 동일한 수정을 반영해 주어야 함(누락될 가능성 발생 ➡️ 버그 발생 가능성 높음)
클래스를 이용한 중복 제거
* 클래스를 이용해서 중복된 코드를 한 곳으로 분리
* 화면 요청 처리하는 JSP + 실제 로직을 수행하는 클래스로 분리 : 일반적인 구성
웹 어플리케이션의 일반적인 구성
* Service 클래스: 사용자의 요청을 처리하는 기능 제공. DAO 클래스를 통해서 DB 연동 처리. 가입 신청 처리, 글 목록 제공 등의 기능 구현
* DAO 클래스: DB와 관련된 CRUD 작업 처리(SQL 쿼리 실행)
* JSP(뷰): Service 클래스가 실행한 결과를 화면에 출력, Service가 기능을 수행하는데 필요한 데이터 전달
* MVC 프레임워크: 사용자 요청을 Service에 전달, Service 실행 결과를 JSP와 같은 뷰에 전달. 스프링 MVC / 스트러츠 와 같은 프레임워크
DAO의 구현
* CRUD를 위한 메서드 정의
- insert() 메서드 : INSERT 쿼리를 실행한다
- select() 메서드 : SELECT 쿼리를 실행한다. 검색 조건에 따라 한 개 이상의 select() 메서드 제공
- update() 메서드 : UPDATE 쿼리를 실행한다
- delete() 메서드 : DELETE 쿼리를 실행한다.
* 테이블과 매핑될 클래스 작성
DAO에 Connection 전달 방법
* DAO 클래스의 메서드에서 직접 Connection을 생성: 1개 이상의 DAO 메서드 호출을 하나의 트랜잭션을 처리 불가
* DAO 객체 생성 시, 생성자에서 Connection을 전달 받기: 1개 이상의 DAO 메서드 호출을 트랜잭션으로 묶을 수 있음 / 불필요하게 DAO 객체를 매번 생성하는 단점
* DAO 클래스의 메서드 파라미터로 : 1개 이상의 DAO 메서드 호출을 트랜잭션으로 묶을 수 있음 / DAO 객체를 매번 생성할 필요 없음
서비스 클래스의 구현
* 사용자의 요청을 처리하기 위한 기능을 구현
* DAO를 통해서 데이터에 접근
* 코드 예
서비스 클래스와 트랜잭션
* 서비스가 제공하는 기능이 트랜잭션 필요시 Connection.setAutoCommit(false)로 트랜잭션 처리
서비스 클래스와 예외 처리
* 서비스 클래스의 메서드는 서비스가 제공하는 기능에 알맞은 예외를 발생시키는 것이 좋음
* 서비스 메서드 내부에서 처리
싱글톤 패턴을 이용한 서비스 / DAO 구현
* 싱글톤 패턴 : 클래스 당 한 개의 객체만 생성되도록 제약하는 구현 패턴
- 구현 방식
* 서비스나 DAO는 매번 객체를 생성할 필요가 없으므로, 싱글톤 패턴 적용하기에 적합
ConnectionProvider의 구현
* 서비스에서 Connection을 직접 생성할 경우 : JDBC URL 등이 변경될 경우 모든 코드를 변경할 수도 있음
➡️➡️ 유지보수에 불리함
* 이런 이유로 Connection을 제공하는 역할을 가진 클래스를 별도로 작성함