MVC2 패턴 - Controller
Model, View, Controller 로 소프트웨어 구조를 구성하는 소프트웨어아키텍처 패턴
Controller
Presentation Layer
•
Application에서 Client와 직접 상호작용하는 Layer
•
핵심 로직인 Service Layer가 외부의 변화에 종속되지 않도록 분리하기 위해
•
Client와 직접 상호작용하는 Presentation Layer를 분리.
•
Client 변경시 Controller의 코드만 변경이 발생
입력데이터를 어플리케이션 내에서 사용하기 적합한 형태로 파싱
부적합한 요청에 대해 허가/불가를 처리하는 외벽 역할(validator, 권한관리)
Client에게 비즈니스로직의 결과물을 어떻게 보여줄 것 인지 선택
•
HTMl로 보낼 것인지, JSON, XML 같은 특정 데이터형식으로 보낼 것인지 등등…
MVC2 패턴 - Model
DAO (Data Access Object)
Persistence Layer (영속성 계층)
: 데이터를 영구적으로 저장하기 위해 DB와 상호작용하는 Layer
필요한 데이터를 DBMS 에 요청
•
DBMS 로 부터 읽어온 데이터를 어플리케이션 내에서 사용하기 적합한 형태로 파싱
사용자인증
// DBMS와의 연결(session)을 관리
// transaction 관리를 위한 메서드를 가진 객체
// transaction 시작 시 Connection 객체 생성
// transaction 종료 시 Connection을 닫음 (close())
Connection conn = null;
// 쿼리 전송용 객체
// select, insert, update, delete 같은 구문을 수행하기 위한 객체
// 데이터베이스에 전달할 sql문을 작성
Statement stmt = null;
// Select 쿼리의 결과로 반환된 데이터들의 집합
// DBMS로 부터 조회된 데이터를 읽어오는 객체
ResultSet rset = null;
Java
복사
Service
•
비지니스 로직(기능 구현)을 구현
•
DB transaction 관리
◦
transaction : 논리적 최소 작업 단위.
◦
commit/rollback을 Service에서 결정
JDBC 코딩 순서
public class MemberDao {
// 사용자 인증
public Member userAuthenticate(String userId, String password) {
Member member = null;
// DBMS와의 연결(session)을 관리
// transaction 관리를 위한 메서드를 가진 객체
// transaction 시작 시 Connection 객체 생성
// transaction 종료 시 Connection을 닫음 (close())
Connection conn = null;
// 쿼리 전송용 객체
// select, insert, update, delete 같은 구문을 수행하기 위한 객체
// 데이터베이스에 전달할 sql문을 작성
Statement stmt = null;
// Select 쿼리의 결과로 반환된 데이터들의 집합
// DBMS로 부터 조회된 데이터를 읽어오는 객체
ResultSet rset = null;
try {
// JDBC 코딩 순서
// 1. jdbc driver 객체를 jvm에 등록
// Reflection을 사용해 원하는 DBMS의 드라이버 객체를 JVM에 등록할 수 있다.
// 인스턴스 생성을 문자열로 하고, 메서드나 필드에 접근할 수 있는 기술
// private 같은 객체지향프로그래밍의 원칙을 위해 만든 자바의 규칙을 무시하고 메서드나 속성 등을 사용할 수
// 있어서 가능하면 사용하지 않는 것이 좋다.
// 우리가 사용할 DBMS의 Driver 클래스를 JVM에 등록
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 데이터베이스와 연결
// jdbc:mysql//<ip>:<port>/<database이름>?queryString
String url = "jdbc:mysql://localhost:3306/bookmanager?useUnicode=true&characterEncoding=utf8";
conn = DriverManager.getConnection(url, "bm", "123qwe!@#QWE");
// 3. 쿼리 전송용 객체 생성
stmt = conn.createStatement();
// 3-1. 쿼리 작성
String query = "select * from member where user_id = '" + userId + "' and password = '" + password + "'";
rset = stmt.executeQuery(query);
// resultSet에서 각 row를 한 줄씩 읽어오는 코드
while (rset.next()) {
member = new Member();
member.setUserId(rset.getString("user_id"));
member.setPassword(rset.getString("password"));
member.setGrade(rset.getString("grade"));
member.setTell(rset.getString("tell"));
member.setEmail(rset.getString("email"));
member.setLeave(rset.getBoolean("is_leave"));
member.setRegDate(rset.getTimestamp("reg_date").toLocalDateTime());
member.setRentableDate(rset.getTimestamp("rentable_date").toLocalDateTime());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
rset.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return member;
}
Java
복사
DTO (Data Transfer Object)
데이터 전송을 담당하는 객체
테이블에 존재하는 컬럼을 속성으로 구현, getter / setter 구현
자바빈 규약
•
모든 필드변수는 private
•
반드시 기본 생성자가 존재한다.
•
모든 필드변수는 getter / setter 를 가진다.
타입
mysql | java | mysql | java |
문자열 타입 | String | 숫자 | int, double |
Timestamp | timestamp | boolean | boolean |
JDBC Template
singleton pattern 임으로 프로그램내에서 한번만 호출되는 생성자
JVM에 com.mysql.cj.jdbc.Driver 클래스의 정보를 올리는 코드.
•
클래스 정보 데이터는 static영역에 올라가기 때문에, 한번만 드라이버를 등록하면 프로그램 종료 때 까지 메모리에 내려오지 않는다.