(오라클 SQL튜닝을 위한 쿼리문 작성법 강좌)오라클 SQL/쿼리 튜닝은 간단한 SQL구문 최적화 부터 시작을 하게되죠, SQL을 처음 사용할 때 부터 최적화 하는 방법에 주의해서 공부하시면 저절로 튜닝 됩니다. 본 PPT 강좌는 탑크리에듀(www.topcredu.co.kr), 오라클자바커뮤니티(ojc.asia)에서 제공하는 교육강좌 입니다.
(오라클 SQL튜닝을 위한 쿼리문 작성법 강좌)오라클 SQL/쿼리 튜닝은 간단한 SQL구문 최적화 부터 시작을 하게되죠, SQL을 처음 사용할 때 부터 최적화 하는 방법에 주의해서 공부하시면 저절로 튜닝 됩니다. 본 PPT 강좌는 탑크리에듀(www.topcredu.co.kr), 오라클자바커뮤니티(ojc.asia)에서 제공하는 교육강좌 입니다.
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로Oracle Korea
OpenJDK로 Java 언어 개선 주도권이 넘어간 후 Java의 개선 속도가 몰라보게 빨라지고 있습니다. Java를 언어, 런타임, 표준 API로 나눌 때 프로그래머에게 가장 중요하다고 볼 수 있는 언어 관점에서 Java가 앞으로 어떻게 개선될 지, Java의 미래를 알아보려고 합니다.
지난 26일(2014/7/26), 지앤선과 KSUG가 함께 진행했던 세미나에서 발표한 람다 관련 내용입니다.
첫 시간에 정대원님이 발표하신 람다 기본에 다루지 않은 내용만 정리했는데 지난 번에 올렸던 자료(http://www.slideshare.net/gyumee/java-8-lambda-35352385)의 후편으로도 볼 수 있을 것 같습니다.
제 발표는 장표만으로 내용을 가늠하기 어려운데 그래도 이번에는 청각 장애인들도 참여한다고 해서 장표에 글자를 많이 넣으려고 했습니다.
"R을 이용한 데이터 처리 & 분석 실무 - 서민구 지음" 정리 자료 #3
- https://thebook.io/006723/
- 첫번째 : goo.gl/FJjOlq
- 두번째 : goo.gl/Wdb90g
- 세번째 : goo.gl/80VGcn
- 네번째 : goo.gl/lblUsR
[Main Session] 미래의 Java 미리보기 - 앰버와 발할라 프로젝트를 중심으로Oracle Korea
OpenJDK로 Java 언어 개선 주도권이 넘어간 후 Java의 개선 속도가 몰라보게 빨라지고 있습니다. Java를 언어, 런타임, 표준 API로 나눌 때 프로그래머에게 가장 중요하다고 볼 수 있는 언어 관점에서 Java가 앞으로 어떻게 개선될 지, Java의 미래를 알아보려고 합니다.
지난 26일(2014/7/26), 지앤선과 KSUG가 함께 진행했던 세미나에서 발표한 람다 관련 내용입니다.
첫 시간에 정대원님이 발표하신 람다 기본에 다루지 않은 내용만 정리했는데 지난 번에 올렸던 자료(http://www.slideshare.net/gyumee/java-8-lambda-35352385)의 후편으로도 볼 수 있을 것 같습니다.
제 발표는 장표만으로 내용을 가늠하기 어려운데 그래도 이번에는 청각 장애인들도 참여한다고 해서 장표에 글자를 많이 넣으려고 했습니다.
"R을 이용한 데이터 처리 & 분석 실무 - 서민구 지음" 정리 자료 #3
- https://thebook.io/006723/
- 첫번째 : goo.gl/FJjOlq
- 두번째 : goo.gl/Wdb90g
- 세번째 : goo.gl/80VGcn
- 네번째 : goo.gl/lblUsR
2시간만에
자바 데이터처리를
쉽게 배우고 싶어요.
가위,바위,보와 승률 (난수와 배열, ArrayList)
주머니속의 데이터 (HashMap)
데이터 다루기 (Sort, Collection Framework)
데이터를 두고보자 (Database와 SQL)
자바로 데이터베이스 사용하기 (JDBC)
JDBC를 조금 더 편하게 (MyBatis)
[함수형 사고] 책을 읽고 진행한 PT
Java 8, Scala, Clojure, Groovy 등의 함수형 프로그래밍 언어에서 사용하고 있는 패러다임을 익힐 수 있습니다.
책을 요약하고 PT를 진행하려고 하니 미숙한 부분이 많으니, 자세한 부분은 책을 참고 부탁드립니다.
책에서는 주로 Groovy에 대한 코드가 많았는데, Scala에 조금 더 익숙하기 때문에 Scala로 작성한 코드가 많습니다.
탑크리에듀교육센터(www.topcredu.co.kr)제공
스프링프레임워크 & 마이바티스(Spring Framework, MyBatis)
20번째 자료입니다. 참고하시어 많은 도움되셨길 바랍니다.
교육 및 수강문의/기타문의사항은 홈페이지(www.topcredu.co.kr)를 통하여 하실 수 있습니다.^^
3. 귀찮은 일
<insert id="insertDoctor" parameterType="domain.Doctor">
insert into Doctor (id,username,password,email,bio)
values (#{id},#{username},#{password},#{email},#{bio})
</insert>
<update id="updateDoctor" parameterType="domain.Doctor">
update Doctor set
username = #{username}, password = #{password},
email = #{email}, bio = #{bio}
where id = #{id}
</update>
<delete id="deleteDoctor” parameterType="int">
delete from Doctor where id = #{id}
</delete>
<select id="selectDoctor" resultType="domain.Doctor">
select * from Doctor
</select>
3
4. 머리 아픈 일
<hibernate-mapping>
<class name="hello.Message“ table="MESSAGES">
<id name="id" column="MESSAGE_ID">
<generator class="increment"/>
</id>
<property name="text" column="MESSAGE_TEXT"/>
<many-to-one name="nextMessage" cascade="all"
column="NEXT_MESSAGE_ID"/>
</class>
</hibernate-mapping>
SELECT new list(mother, offspr, mate.name)
FROM DomesticCat AS mother
INNER JOIN mother.mate AS mate
LEFT OUTER JOIN mother.kittens AS offspr
4
5. 하고 싶은 일
• SQL 작성 최소화
• Object oriented programming
• 로직에 집중
• 단순한 설정 - 쉽고, 직관적
• 학습의 최소화
5
8. 고려해야 할 점
• 설정
– object, relation 매핑
• SQL 생성
– object 를 SQL 의 파라미터로 전달
– SQL 결과를 object 로 리턴
8
9. 구현 전략
• object 와 relation 의 1:1 매핑 구현
– MyBatis 를 이용하여 기본적인 insert, update,
delete, select 문을 runtime 자동 생성
– 생성된 SQL문을 MyBatis SQL repository 에
저장
– Association 은 다루지 않음
– Join, subquery 구문은 MyBatis로 처리
• 설정은 Java Annotation 사용
• 일단 MySQL 먼저
9
10. Java Annotation
• 자바 5.0 에서 소개
• 자바 소스 코드에 추가되는 문법적인 메타데이터
• 클래스, 메소드, 변수, 파라미터, 패키지에 첨언하
여 컴파일러의 의해 .class 파일에 포함되어 컴파일
혹은 런타임 시 이용
• 번거로운 설정 작업들과 반복적인 코드를 줄여줌
• Built-in Annotations
– @Override, @Deprecated, @SupressWarnings
• Custom Annotations
– @Controller, @Service, @Entity, @Column
10
11. Custom Annotation
• @interface 선언
public @interface MyAnnotation {
String value();
}
• Annotation 추가
import MyAnnotation
@MyAnnotation(value=“my annotation”)
public void myMethod(int arg) {
// do something
}
11
12. Annotation API
• Class 와 Field
– getAnnotation(Class<A> annotationClass)
특정 타입에 대한 annotation 을 리턴
– getAnnotations()
모든 타입의 annotation 을 리턴
– isAnnotationPresent(Class annotationClass)
특정 타입에 대한 annotation 이 존재하면
true 리턴
12
13. MyBatis
• 구) iBatis
• SQL문과 객체를 매핑
• SQL문을 XML 파일에 저장
• JDBC 코드 제거
13
출처) www.mybatis.org
14. MyBatis 예제
• Mapped Statement
<mapper namespace="org.mybatis.example.HospitalMapper">
<select id="selectHospital" parameterType="int"
resultType="Hospital">
select * from Hospital where id = #{id}
</select>
</mapper>
• Java DAO code
public interface HospitalMapper {
public Hospital selectHospital(int id);
}
HospitalMapper mapper = session.getMapper(HospitalMapper.class);
Hospital hospital = mapper.selectHospital(101);
14
15. 순서
1. Table 생성
2. Annotation 정의
3. Mapping class 생성
4. EntityManager 작성 – CRUD interface
5. SQL Generation 클래스 작성
– InsertSqlSource
– UpdateSqlSource
– DeleteSqlSource
– SelectOneSqlSource
– SelectListSqlSource
15
16. 1. Table 생성
Create table hospital (
hospitalid INT NOT NULL
PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30),
regdttm DATETIME
)
16
21. 5. SQL Generation
• INSERT
– 컬럼 중 auto_increment 로 선언된 컬럼은 insert 문
에서 제외
• UPDATE
– Primary Key 가 아닌 컬럼들만 update
– PK로 where 조건절 생성
• DELETE
– parameter 객체에서 null 값이 아닌 field 로 where 조
건절 생성
• SELECT
– parameter 객체에서 null 값이 아닌 field 로 where 조
건절 생성
21
22. 5-1. Insert문 생성
• 컬럼 중 auto_increment 로 선언된 컬럼은
insert 문에서 제외
<생성되는 SQL>
INSERT INTO hospital (name, regdttm)
VALUES (#{name}, #{regdttm})
22
26. AnnotationUtil.getNonAutoIncrem
entColumnNames
1: List<String> names = new LinkedList<String>();
2: for (Field field : clazz.getDeclaredFields()) {
3: if (field.isAnnotationPresent(Column.class)) {
4: Column c = field.getAnnotation(Column.class);
5: if (!c.autoIncrement())
6: names.add("".equals(c.name()) ? field.getName():c.name());
7: }
8: }
9: return names;
26
27. 5-2. Update문 생성
• Primary Key 가 아닌 컬럼들만 update
• PK로 where 조건절 생성
<생성되는 SQL>
UPDATE hospital
SET name = #{name}, regdttm = #{regdttm}
WHERE hospitalid = #{hospitalid}
27
30. AnnotationUtil.getNonPrimaryKey
ColumnNames
1: List<String> names = new LinkedList<String>();
2: for (Field field : clazz.getDeclaredFields()) {
3: if (field.isAnnotationPresent(Column.class)) {
4: Column c = field.getAnnotation(Column.class);
5: if (!c.primaryKey())
6: names.add("".equals(c.name()) ? field.getName() :
7: c.name());
8: }
9: }
10: return names;
30
31. AnnotationUtil.getPrimaryKeyColu
mnNames
List<String> names = new LinkedList<String>();
for (Field field : clazz.getDeclaredFields()) {
if (field.isAnnotationPresent(Column.class)) {
Column c = field.getAnnotation(Column.class);
if (c.primaryKey())
names.add("".equals(c.name()) ? field.getName() : c.name());
}
}
return names;
31
32. 5-3. Delete문 생성
• parameter 객체에서 null 값이 아닌 field 로
where 조건절 생성
예)
Hospital hospital = new Hospital();
hospital.setName(“JCO병원”);
entityManager.delete(hospital);
<생성되는 SQL>
DELETE FROM hospital
WHERE name = #{name}
32
35. 5-4. Select문 생성
• parameter 객체에서 null 값이 아닌 field 로 where
조건절 생성
예)
Hospital hospital = new Hospital();
hospital.setName(“JCO병원”);
hospital = (Hospital)entityManager.load(hospital);
<생성되는 SQL>
SELECT hospitalid, name, regdttm
FROM hospital
WHERE name = #{name}
35
38. 복습
1. Table 생성
2. Annotation 정의
3. Mapping class 생성
4. EntityManager 작성 – CRUD interface
5. SQL Generation 클래스 작성
– InsertSqlSource
– UpdateSqlSource
– DeleteSqlSource
– SelectOneSqlSource
– SelectListSqlSource
38
39. Effect
• 비타민MD 사이트에 일부 적용
• 만약 전체 적용한다면
69% SQL문 제거 가능
39
SQL 적용 전 적용 후
insert 112 7
update 80 2
delete 79 0
select 327 176
총 598 185
40. Future Work
• Annotation 추가
– Like 구문 지원
– DDL 상의 default 값, not null 등의 constraint
지원
• Transaction
• Caching
• Oracle, MSSQL, DB2 등 다른 DBMS 지원
40
43. 이 저작물은 크리에이티브 커먼스 코리아 저작자표시-비영리-
동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
This work is Licensed under Creative Commons Korea Attribution 2.0 License.