본문 바로가기

Java

Java - MVC, 정적 쿼리, 동적 쿼리

@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