[개발] Spring 구조
주석 종류
구현주석 (개별적 구현에 대한 주석입니다.)
1.
// System.out.println("구현주석 - End Of Line 주석입니다.");
// System.out.println("ctrl + /");
2.
/*
* System.out.println("구현주석 - Block 주석입니다.");
* System.out.println("ctrl + shift + /");
* System.out.println("ctrl + shift + \");
*/
문서주석(API나 도움말 만들때 쓰는 주석입니다. - 그래서 Class의 시작부분에 추가합니다.)
생성방법 : "Class나 Mehto 위에 '/**'입력후 엔터 = 템플릿 자동완성"
/**
*
* @return
*/
public String printHello() {
String s = "Hello World!";
return s;
}
Spring 구조
Mapper.java 파일을 사용하는 것이 편리하다.
-
Controller.java / Service.java /
Mapper.java
/ Mapper.xml- Mapper.java : 단순인터페이스 = Mybatis 3.0부터
- Mapper 인터페이스란?
- 설명
- MyBatis 매핑 XML에 기재된 SQL을 호출하기 위한 인터페이스
- MyBatis 3.0부터 생겨남
- 사용하지 않을 경우
- SqlSession을 등록해야함
- 우리는 지금까지 SqlSession에 직접 statement ID및 매개변수 전달방식을 사용하여 SQL를 실행하였음
- Mapper.java를 사용하면 SqlSession을 직접 사용하는 것 보다 안전
- 이유 : 맵핑 파일이 자동으로 Mapper단위가 되기 때문에 관리가 쉬워지기 때문
- DAO인터페이스 + 인터페이스를 구현한 DAO클래스를 생성해야함
- 문자열로 작성하기 때문에 버그가 생길 수 있다.
- IDE에서 제공하는 code assist를 사용할수 없다.
- SqlSession을 등록해야함
- 사용할 경우
- Mapper인터페이스는 개발자가 직접작성
- Mapper namespace는 패키지명을 포함한 인터페이스명으로 작성한다.
- SQL id는 인터페이스에 정의도니 메소드명과 동일하게 작성
- 설명
//Mapper.java @Mapper public interface AMapper{ public List<BVO> searchList(AVO avod){ .... } } //Mapper.xml = SQL.XML <mapper namespace="경로.AMapper.java"> <select id = "searchList" parameterType="AVO" resultType="BVO"> ..... </select> </mapper>
-
Controller.java / Service.java /
DAO.java
/ Mapper.xml- DAO.java : 인터페이스 + 클래스
- DAO를 사용하는 이유?
- 효율적인 커넥션관리와 보완성때문
- 저수준의 Logic과 고급 비즈니스 Logic을 분리하고 domain logic으로부터 DB관련 merchanism을 숨기기 위해 사용됨
MyBatis 정리
-
동적SQL
-
if
-
choose
WHERE .... <CHOOSE> <WHEN test = "title != null"> AND ... </WHEN> <OTHERWISE> AND .. </OTHERWISE> </CHOOSE>
-
trime
WHERE state = 'a' <if test = 'title != null'> AND ... </if> ## 이럴 경우, 조건에 맞는 것을 잘못설정하면 ## WHERE이나 WHERE AND A 이런식으로 문법오류가 생김 <trim prefix ="SET" suffixOverrides = ","> ... </trim> <trim prefix="WHERE" prefixOverrides="AND|OR"> ... </trim>
-
foreach
WHERE ID in <foreach item ="item" index ="index" collection ="list" open ="(" seperator = "." close = ")"> #{item} </foreach>
-
Mybatis-config.xml 설정
-
caheEnabled
- MyBatis의 cache기능은 설정하지 않으면 기본이 on상태
- value = false : 캐싱없이 진행하다가 추후에 문제시 캐싱을 추가하는게 맞지 않을까?
- 하나의 SqlSession을 가지고 동일한 SQL을 반복 호출시 캐싱된 동일한 결과를 받게 돼
- 다시말하면, 멀티 프로세스로 비동기처리를 하고 메인프로세스가 작업의 완료여부를 반복적인 DB조회를 통해서 체크한다고 하겠다면
- 모든 비동기처리가 완료되어 DB의 데이터는 처리완료상태가 되어도 메인프로세스는 계속해서 캐싱된 결과를 조회되기 때문에 문제가 발생돼!!! 그래서 value 를 false로 두고 필요에 따라 따로 설정해주는거야!
- 다시말하면, 멀티 프로세스로 비동기처리를 하고 메인프로세스가 작업의 완료여부를 반복적인 DB조회를 통해서 체크한다고 하겠다면
- MyBatis cache 종류
- local cache
- MyBatis에서 별도의 설정을 하지않아도 항상 켜져있는 cache
- 속성은 2가지(캐시 데이터의 생존범위 구분)
- Session (default)
- statement
- second cache
- mapper namespace 단위로 동작한다.
- local cache
- MyBatis의 cache기능은 설정하지 않으면 기본이 on상태
-
mapUnderscoreToCamelCase
언더바를 지우고 뒤에 문자를 대문자로 자동치환 인식해준다.
//Snake Cases를 사용하는 DBMS Table CLIENT_CODE int(11) CLIENT_NAME varchar(20) CLIENT_CUSTOMER varchar(30) //Camel Case를 사용하는 VO public class ClientVO{ private int clientCode; private String clientName; private String clientCustomer; }
-
jdbcTypeForNull
파라미터로 넘긴 일부 컬럼의 값이 NULL일때
ORACLE에서 Nullable Column(null 값이 들어갈 수 있는 컬럼)을 사용하기 위해서 처리해준다.
- value = “VARCHAR” : null을 varchar로 하겠다.
ERROR jdbcTypeForNull configuration property Cause : java.sql.SQLException: 부적합한 열 유형:1111
-
defaultStatementTimeout
데이터베이스로의 응답을 얼마나 오래 기다릴지 판단하는 타임아웃을 설정
- value =’15’ : 타임아웃 15초