@markdown
# MVC 패턴
____
- Model / View / Controller
- 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴이다.
- 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 백그라운드에서 실행되는 비즈니스 로직을 쉽게 고칠 수 있는 애플리케이션을 만들 수 있다.
- MVC에서 모델은 애플리케이션의 데이터, 뷰는 사용자 인터페이스 요소, 컨트롤러는 데이터와 비즈니스 로직 사이의 상호동작을 관리한다.
- 참고 : [모델-뷰-컨트롤러](https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%8D%B8-%EB%B7%B0-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC)
- 소스코드 : [DeptDAO.java](https://github.com/KSLEE7746/tistory/blob/master/DeptDAO.java), [DeptDTO.java](https://github.com/KSLEE7746/tistory/blob/master/DeptDTO.java), [DeptView.java](https://github.com/KSLEE7746/tistory/blob/master/DeptView.java), [DeptController.java](https://github.com/KSLEE7746/tistory/blob/master/DeptController.java)
## DAO(Data Access Object)
____
- 데이터베이스 접근 시 직접 데이터를 조회(select), 조작(DML)하는 기능을 하도록 만든 오브젝트
- ex) selectAllData() 호출시 DB연결 -> DB조회 -> 데이터셋 리턴하도록 로직이 구현된다.
## DTO(Data Transfer Object)
____
- JavaBeans 기술에서 계층간 데이터 교환을 위해 이용
- MyBatis에서 사용
- 규칙 : 멤버변수, 디폴트 생성자, Getter/Setter가 꼭 있어야한다.(로직 x)
- 단순하게 객체 생성을 위한 Class 정의와 비슷하다.
- VO(Value Object)라고도 부름
#Java 정적 쿼리 vs 동적 쿼리
____
- Java 쿼리 전송에 사용되는 인터페이스
- 정적 : `Statement`, 동적 : `PreparedStatement`
- 동적 쿼리를 사용하는 것이 정적 쿼리보다 수행 속도 측면에서 미리 컴파일 되기 때문에 빠르다는 장점이 있다.
- 동적 쿼리는 `' '` 작은 따옴표 문제를 쿼리 실행시 자동으로 변환해주기 때문에 코드 작성할때 신경쓸 필요가 없다.
### 정적 쿼리(Statement)
____
- SQL 쿼리를 문자열 연결로 매개변수를 사용하는 방식(미리 입력되어 있는 방식)
- 수행 방식
<pre><code>1. buffer에 저장 후 SQL 문장 찾기
2.쿼리 구문 파싱
3.구문분석
4.실행
5.결과를 버퍼에 저장
</pre></code>
- 정적 쿼리 방식은 SQL 문장이 중복해서 DB로 전송되기 때문에 비효율적이다.
- 매번 실행마다 값이 바뀌는 부분을 포함해 전체 쿼리가 전송된다.
- DB에서 쿼리 재사용이 불가하다.
<pre><code class="java" style="font-size:14px">String sql = "select * from employees where employee_id = " + empId;
st = conn.createStatement();
rs = st.executeQuery(sql);
</code></pre>
### 동적 쿼리(PreparedStatement)
____
- 정적 쿼리의 비효율을 해결하기 위한 쿼리방식이다.
- SQL 쿼리에 바인딩 변수를 사용해 DB로 질의한다.
- `PreparedStatement`를 사용해 바인딩 변수`(?)` 작성
- SQL 쿼리에서 계속 바뀌는 가변 인수를 `?`로 작성한다.
- SQL 재사용이 가능하다. (바인딩 변수 제외한 부분)
<pre><code class="java" style="font-size:14px">String sql = "select * from employees where employee_id = ?";
st = conn.prepareStatement(sql);
st.setString(1, empId); // 1은 바인드 변수 ?의 순서를 나타냄
rs = st.executeQuery();
</code></pre>
## execute() vs executeQuery() vs executeUpdate()
____
### executeQuery()
____
- 조회(select) 쿼리를 실행하는 함수
- 리턴 : 조회된 데이터 결과셋(ResultSet)이 리턴된다.
- `st.getResultSet()`으로 결과 확인할 수 있다.
### executeUpdate()
____
- DML(insert, update, delete) 쿼리를 실행하는 함수
- 리턴 : DML 실행으로 갱신된 행의 카운트나 0을 리턴
- `st.getUpdateCount()`를 통해 DML 수행된 결과 갱신 행의 카운트를 알 수 있다.
### execute()
____
- select을 사용할지, DML을 사용할지 명확하지 않을때 사용
- 가변 SQL 쿼리를 실행 시킬 수 있다.(select, insert, update, delete)
- 함수 실행결과 true이면 ResultSet이 있다는 것(select 실행)
- false이면 DML을 실행한 결과로 갱신된 카운트 수가 있다는 것을
<pre><code class="java" style="font-size:14px">if(st.execute()){
rs = st.getResultSet();
} else {
count = st.getUpdateCount();
}
</code></pre>
'Java' 카테고리의 다른 글
Java - 웹 크롤러 만들기(1) (2) | 2017.05.31 |
---|---|
Java - AutoCloseable, Network 프로그래밍 (0) | 2017.05.29 |
Java - JDBC 사용 및 DB 연결 (0) | 2017.05.20 |
Java 문법 - Generic, Collection, IO (0) | 2017.05.10 |
Java 문법 - String, Arrays, Thread (0) | 2017.05.08 |