ݺߣ

ݺߣShare a Scribd company logo
ORM 을 맞이하는 

우리의 자세
정병태
랑겔한스 : 정병태
- Web Developer

- OKKY.KR Contributor

- https://github.com/1angerhans
- http://okky.kr/user/info/26138
- btjung@ebrain.kr
‘나는 SQL 이 싫어요.’
ORM

Object Relational Mapping
– Wikipedia 인용
“Object-relational mapping (ORM, O/RM, and O/R
mapping) in computer science is a programming
technique for converting data between
incompatible type systems in object-oriented
programming languages.”
– Wikipedia 인용
“객체 관계 매핑(Object-relational mapping; ORM)은
데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되
지 않는 데이터를 변환하는 프로그래밍 기법이다.”
Object-relational
impedance mismatch
- Data type differences
- Structural and integrity differences
- Manipulative difference
- Transactional differences
https://en.wikipedia.org/wiki/Object-relational_impedance_mismatch
문제의 해결
Without ORM
현실의 문제 #1
Vo, DTO 그리고 ղ들
D.D.D
Domain Driven Design
Domain Entity 설계
CREATE TABLE TBL_MSG
(
F_GRP_ID INT(6) NOT NULL PRIMARY KEY ,
PTN_ID INT(6) ,
PRIORITY INT(6) ,
JOB_CODE INT(6) ,
FLAG_PRO INT(6) ,
CHAINNUM INT(6) ,
MASSNUM INT(6) ,
USERID VARCHAR(20) ,
CPCODE VARCHAR(20) ,
QTCODE VARCHAR(20) ,
MSGSEPER CHAR(1) ,
MSG_CNT INT(6) ,
흔한 Legacy Table
Minimization
CREATE TABLE TBL_USER (
SEQ INT(6) NOT NULL PRIMARY KEY ,
USER_TYPE VARCHAR(20) ,
AUTH_TYPE VARCHAR(20) ,
USERID VARCHAR(20) ,
NAME VARCHAR(20) ,
PASS VARCHAR(20) ,
TEL VARCHAR(12) ,
CELL VARCHAR(12) ,
OFFICE_TEL VARCHAR(12) ,
EMAIL VARCHAR(200) ,
ZIPCODE VARCHAR(7) ,
ADDRESS_01 VARCHAR(200) ,
ADDRESS_02 VARCHAR(200) ,
COMPANY_NAME VARCHAR(20) ,
QUARTER_NAME VARCHAR(20) ,
STATUS VARCHAR(20) ,
MILEAGE INT(12) ,
REG_DATE DATE ,
PASS_CHG_DATE DATE ,
PASS_FAIL_CNT INT(6)
);
User
Contact
Company
Domains
Auth
Mileage
CREATE TABLE TBL_USER (
SEQ INT(6) NOT NULL PRIMARY KEY ,
USER_TYPE VARCHAR(20) ,
USERID VARCHAR(20) ,
NAME VARCHAR(20) ,
PASS VARCHAR(20) ,
STATUS VARCHAR(20) ,
REG_DATE DATE ,
PASS_CHG_DATE DATE ,
PASS_FAIL_CNT INT(6)
);
CREATE TABLE TBL_COMPANY (
SEQ INT(6) NOT NULL PRIMARY KEY ,
COMPANY_NAME VARCHAR(20) ,
STATUS VARCHAR(20) ,
REG_DATE DATE
);
CREATE TABLE TBL_AUTH (
SEQ INT(6) NOT NULL PRIMARY KEY ,
ROLE VARCHAR(20)
);
CREATE TABLE TBL_ADDRESS (
ZIPCODE VARCHAR(7) ,
ADDRESS_01 VARCHAR(200) ,
ADDRESS_02 VARCHAR(200)
);
CREATE TABLE TBL_CONTACT (
SEQ INT(6) NOT NULL PRIMARY KEY ,
TEL VARCHAR(12) ,
CELL VARCHAR(12)
);
CREATE TABLE TBL_MILEAGE (
SEQ INT(6) NOT NULL PRIMARY KEY ,
POINT INT(12)
);
public class User {
Long seq;
String userid;
String userpass;
String username;
Date regDate;
Company company;
Address address;
Contact contact;
Mileage mileage;
List<Auth> authorities;
// Getter & Setter
}
public class Company {
…
}
public class Address {
…
}
public class Contact {
…
}
public class Mileage {
…
}
public class Auth {
…
}
현실의 문제 #2
DBA
CREATE TABLE TBL_USER (
SEQ INT(6) NOT NULL PRIMARY KEY ,
USER_TYPE VARCHAR(20) ,
USERID VARCHAR(20) ,
NAME VARCHAR(20) ,
PASS VARCHAR(20) ,
STATUS VARCHAR(20) ,
REG_DATE DATE ,
PASS_CHG_DATE DATE ,
PASS_FAIL_CNT INT(6)
);
CREATE TABLE TBL_COMPANY (
SEQ INT(6) NOT NULL PRIMARY KEY ,
COMPANY_NAME VARCHAR(20) ,
STATUS VARCHAR(20) ,
REG_DATE DATE
);
CREATE TABLE TBL_AUTH (
SEQ INT(6) NOT NULL PRIMARY KEY ,
ROLE VARCHAR(20)
);
CREATE TABLE TBL_ADDRESS (
ZIPCODE VARCHAR(7) ,
ADDRESS_01 VARCHAR(200) ,
ADDRESS_02 VARCHAR(200)
);
CREATE TABLE TBL_CONTACT (
SEQ INT(6) NOT NULL PRIMARY KEY ,
TEL VARCHAR(12) ,
CELL VARCHAR(12)
);
CREATE TABLE TBL_MILEAGE (
SEQ INT(6) NOT NULL PRIMARY KEY ,
POINT INT(12)
);
DBA 들이 나를 향해 이렇게 외친다.
public class MSG {
int grpnum;
int chainnum;
String userid;
String usernm;
String cpcode;
String qtcode;
String title;
String sndTitle;
String cComment;
String dstaddr;
String callback;
String msgTemplet;
흔한 Legacy Model
Mybatis Association
<select id="selectOne" resultMap=“userMap">
select
u.seq, u.userid, u.pass, u.name, u.tel, u.cel, u.email, u.company_name, u.zipcode,
u.address_01, u.address_02 ….
from
tbl_user u
where
u.seq = #{seq}
</select>
Mybatis
Mybatis Association
<resultMap id="userMap" type=“User">
<id jdbcType="INTEGER" property="seq" column="seq"/>
<result jdbcType="VARCHAR" property="userid" column="userid"/>
<result jdbcType="VARCHAR" property="pass" column="pass"/>
<association property="company" javaType="Company" >
<result jdbcType="VARCHAR" property=“company_name" column="cpname"/>
</association>
<association property="contact" javaType="Contact" >
<result jdbcType="VARCHAR" property=“company_name" column="cpname"/>
</association>
<association property="address" javaType="Address" >
<result jdbcType="VARCHAR" property=“zopcode" column=“zopcode"/>
<result jdbcType="VARCHAR" property=“address_01” column=“address_01"/>
<result jdbcType="VARCHAR" property=“address_01” column="address_01"/>
</association>
<collection property="authorities" select="selectUserAuthList" fetchType="lazy" column="{seq=seq}" />
</resultMap>
– 미상
“인간의 욕심은 끝이 없고, 같은 실수를 반복한다.”
With ORM
Hibernate
@Entity
@Table( name = “TBL_USER" )
public class User {
Integer seq;
String userid;
String userpass;
String username;
Date regDate;
Company company;
Address address;
Contact contact;
Mileage mileage;
List<Auth> authorities;
// Getter & Setter
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = “increment”)
@Column(name = “SEQ”)
Long getSeq() {
return seq;
}
}
@Entity
@Table( name = “TBL_COMPANY" )
public class Company {
…
}
@Entity
@Table( name = “TBL_ADDRESS" )
public class Address {
…
}
@Entity
@Table( name = “TBL_CONTACT" )
public class Contact {
…
}
@Entity
@Table( name = “TBL_MILEAGE" )
public class Mileage {
…
}
@Entity
@Table( name = “TBL_AUTH" )
public class Auth {
…
}
CREATE TABLE TBL_USER (
SEQ INT(6) NOT NULL PRIMARY KEY ,
USER_TYPE VARCHAR(20) ,
USERID VARCHAR(20) ,
NAME VARCHAR(20) ,
PASS VARCHAR(20) ,
STATUS VARCHAR(20) ,
REG_DATE DATE ,
PASS_CHG_DATE DATE ,
PASS_FAIL_CNT INT(6)
);
CREATE TABLE TBL_COMPANY (
SEQ INT(6) NOT NULL PRIMARY KEY ,
COMPANY_NAME VARCHAR(20) ,
STATUS VARCHAR(20) ,
REG_DATE DATE
);
CREATE TABLE TBL_AUTH (
SEQ INT(6) NOT NULL PRIMARY KEY ,
ROLE VARCHAR(20)
);
CREATE TABLE TBL_ADDRESS (
ZIPCODE VARCHAR(7) ,
ADDRESS_01 VARCHAR(200) ,
ADDRESS_02 VARCHAR(200)
);
CREATE TABLE TBL_CONTACT (
SEQ INT(6) NOT NULL PRIMARY KEY ,
TEL VARCHAR(12) ,
CELL VARCHAR(12)
);
CREATE TABLE TBL_MILEAGE (
SEQ INT(6) NOT NULL PRIMARY KEY ,
POINT INT(12)
);
DBA 들이 나를 향해 이렇게 외친다.
CREATE TABLE TBL_USER (
SEQ INT(6) NOT NULL PRIMARY KEY ,
USER_TYPE VARCHAR(20) ,
AUTH_TYPE VARCHAR(20) ,
USERID VARCHAR(20) ,
NAME VARCHAR(20) ,
PASS VARCHAR(20) ,
TEL VARCHAR(12) ,
CELL VARCHAR(12) ,
OFFICE_TEL VARCHAR(12) ,
EMAIL VARCHAR(200) ,
ZIPCODE VARCHAR(7) ,
ADDRESS_01 VARCHAR(200) ,
ADDRESS_02 VARCHAR(200) ,
COMPANY_NAME VARCHAR(20) ,
QUARTER_NAME VARCHAR(20) ,
STATUS VARCHAR(20) ,
MILEAGE INT(12) ,
REG_DATE DATE ,
PASS_CHG_DATE DATE ,
PASS_FAIL_CNT INT(6)
);
User
Contact
Company
Domains
Auth
Mileage
@Entity
@Table( name = “TBL_USER" )
public class User {
@Id
@GeneratedValue(generator="increment")
@GenericGenerator(name="increment", strategy = “increment”)
@Column(name = “SEQ”)
Integer seq;
@Column(name = “USERID”)
String userid;
@Embedded
Company company;
@Embedded
Address address;
@Embedded
Contact contact;
@OneToOne( cascade = CascadeType.ALL, fetch = FetchType.LAZY)
Mileage mileage;
@OneToMany( cascade = CascadeType.ALL, fetch = FetchType.LAZY)
List<Auth> authorities;
}
@Embeddable
public class Company {
…
}
@Embeddable
public class Address {
…
}
@Embeddable
public class Contact {
…
}
@Embeddable
public class Mileage {
…
}
@Embeddable
public class Auth {
…
}
Criteria
Criteria
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.eq("seq", seq))
.setProjection(
Projections.projectionList()
.add(Projections.property(“zipcode"))
.add(Projections.property(“address_01"))
.add(Projections.property(“address_02")))
.setResultTransformer(
Transformers.aliasToBean(Address.class));
Address address = criteria.uniqueResult();
HQL
HQL
Address address = session.createQuery(“select u.zipcode,
u.address_01, u.address_02 from User u where seq = :seq”, )
.setParameter("seq", seq)
.setResultTransformer(
Transformers.aliasToBean(Address.class))
.uniqueResult();
ORM 에 대한 단상
• Legacy DB 도 충분히 도입 가능하다.
• ORM을 염두한 디자인을 적용할 경우 생산성이 급격히 좋아진다.
• Criteria는 학습이 쉽지 않다.
• HQL을 쓸 때면 뭔가 손해보는 기분.. (방언 처리 라고는 하지만..)
• 퍼포먼스는 사실상 문제 없다.
• SQL Layer가 빠져야돼.
ORM 은
우리가 가지고 있는 문제를 해결한
‘결과’가 아닌
더욱 나은 방향으로 가기 위한
‘과정’ 입니다.
– 저
No SQL
SQL이 필요 없다고
RDBMS가 필요 없는건 아닐껍니다.
공유의 시간

More Related Content

Similar to ORM을 맞이하는 우리의 자세 (20)

SPOOL output.log DROP TABL.pdf
SPOOL output.log DROP TABL.pdfSPOOL output.log DROP TABL.pdf
SPOOL output.log DROP TABL.pdf
fashionfootwear1
EJERCICIOS DE BENFORTAN
EJERCICIOS DE BENFORTANEJERCICIOS DE BENFORTAN
EJERCICIOS DE BENFORTAN
arkangel8801
Bronte's Assortment Presentation ݺߣ
Bronte's Assortment Presentation ݺߣBronte's Assortment Presentation ݺߣ
Bronte's Assortment Presentation ݺߣ
sulabh4
Writeable ct es_pgcon_may_2011
Writeable ct es_pgcon_may_2011Writeable ct es_pgcon_may_2011
Writeable ct es_pgcon_may_2011
David Fetter
OakTable World 2015 - Using XMLType content with the Oracle In-Memory Column...
OakTable World 2015  - Using XMLType content with the Oracle In-Memory Column...OakTable World 2015  - Using XMLType content with the Oracle In-Memory Column...
OakTable World 2015 - Using XMLType content with the Oracle In-Memory Column...
Marco Gralike
Cis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry universityCis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry university
jackiechaner
Cis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry universityCis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry university
7Fase1
Cis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry universityCis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry university
jskdhklsduopuo0980
Cis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry universityCis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry university
CIS339
Data Processing Inside PostgreSQL
Data Processing Inside PostgreSQLData Processing Inside PostgreSQL
Data Processing Inside PostgreSQL
EDB
Lecture05sql 110406195130-phpapp02
Lecture05sql 110406195130-phpapp02Lecture05sql 110406195130-phpapp02
Lecture05sql 110406195130-phpapp02
Lalit009kumar
Fin data model
Fin data modelFin data model
Fin data model
sridhark1981
Database Architecture
Database ArchitectureDatabase Architecture
Database Architecture
Er. Nawaraj Bhandari
Cis336 week 1 i lab 1
Cis336 week 1 i lab 1Cis336 week 1 i lab 1
Cis336 week 1 i lab 1
CIS339
Cis336 week 1 i lab 1
Cis336 week 1 i lab 1Cis336 week 1 i lab 1
Cis336 week 1 i lab 1
CIS339
CreacióN Tablas En Oracle
CreacióN Tablas En OracleCreacióN Tablas En Oracle
CreacióN Tablas En Oracle
esacre
CIS/336 ilab 1 of 7
CIS/336 ilab 1 of 7CIS/336 ilab 1 of 7
CIS/336 ilab 1 of 7
ashhadiqbal
SQL FILE FROM MOODLEUSE [master]GO Object Databa.pdf
SQL FILE FROM MOODLEUSE [master]GO Object Databa.pdfSQL FILE FROM MOODLEUSE [master]GO Object Databa.pdf
SQL FILE FROM MOODLEUSE [master]GO Object Databa.pdf
arrowit1
Constraint Optimization
Constraint OptimizationConstraint Optimization
Constraint Optimization
Oren Nakdimon
Sql practise for beginners
Sql practise for beginnersSql practise for beginners
Sql practise for beginners
ISsoft
Bronte's Assortment Presentation ݺߣ
Bronte's Assortment Presentation ݺߣBronte's Assortment Presentation ݺߣ
Bronte's Assortment Presentation ݺߣ
sulabh4
Writeable ct es_pgcon_may_2011
Writeable ct es_pgcon_may_2011Writeable ct es_pgcon_may_2011
Writeable ct es_pgcon_may_2011
David Fetter
OakTable World 2015 - Using XMLType content with the Oracle In-Memory Column...
OakTable World 2015  - Using XMLType content with the Oracle In-Memory Column...OakTable World 2015  - Using XMLType content with the Oracle In-Memory Column...
OakTable World 2015 - Using XMLType content with the Oracle In-Memory Column...
Marco Gralike
Cis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry universityCis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry university
jackiechaner
Cis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry universityCis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry university
7Fase1
Cis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry universityCis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry university
jskdhklsduopuo0980
Cis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry universityCis336 all i labs week 1 to week 7 devry university
Cis336 all i labs week 1 to week 7 devry university
CIS339
Data Processing Inside PostgreSQL
Data Processing Inside PostgreSQLData Processing Inside PostgreSQL
Data Processing Inside PostgreSQL
EDB
Lecture05sql 110406195130-phpapp02
Lecture05sql 110406195130-phpapp02Lecture05sql 110406195130-phpapp02
Lecture05sql 110406195130-phpapp02
Lalit009kumar
Cis336 week 1 i lab 1
Cis336 week 1 i lab 1Cis336 week 1 i lab 1
Cis336 week 1 i lab 1
CIS339
Cis336 week 1 i lab 1
Cis336 week 1 i lab 1Cis336 week 1 i lab 1
Cis336 week 1 i lab 1
CIS339
CreacióN Tablas En Oracle
CreacióN Tablas En OracleCreacióN Tablas En Oracle
CreacióN Tablas En Oracle
esacre
SQL FILE FROM MOODLEUSE [master]GO Object Databa.pdf
SQL FILE FROM MOODLEUSE [master]GO Object Databa.pdfSQL FILE FROM MOODLEUSE [master]GO Object Databa.pdf
SQL FILE FROM MOODLEUSE [master]GO Object Databa.pdf
arrowit1
Sql practise for beginners
Sql practise for beginnersSql practise for beginners
Sql practise for beginners
ISsoft

Recently uploaded (20)

Data Storytelling for Portfolio Leaders - Webinar
Data Storytelling for Portfolio Leaders - WebinarData Storytelling for Portfolio Leaders - Webinar
Data Storytelling for Portfolio Leaders - Webinar
OnePlan Solutions
Lecture-11-AutomatedTesting-software.pptx
Lecture-11-AutomatedTesting-software.pptxLecture-11-AutomatedTesting-software.pptx
Lecture-11-AutomatedTesting-software.pptx
ssuser39f59e
Enscape Latest 2025 Crack Free Download
Enscape Latest 2025  Crack Free DownloadEnscape Latest 2025  Crack Free Download
Enscape Latest 2025 Crack Free Download
rnzu5cxw0y
Tenorshare 4uKey Crack Fre e Download
Tenorshare  4uKey  Crack  Fre e DownloadTenorshare  4uKey  Crack  Fre e Download
Tenorshare 4uKey Crack Fre e Download
oyv9tzurtx
Elastic Search Engineer Certification - Virtual
Elastic Search Engineer Certification - VirtualElastic Search Engineer Certification - Virtual
Elastic Search Engineer Certification - Virtual
Gonçalo Pereira
Why Hire Python Developers? Key Benefits for Your Business
Why Hire Python Developers? Key Benefits for Your BusinessWhy Hire Python Developers? Key Benefits for Your Business
Why Hire Python Developers? Key Benefits for Your Business
Mypcot Infotech
ChatGPT and DeepSeek: Which AI Tool Delivers Better User Experience?
ChatGPT and DeepSeek: Which AI Tool Delivers Better User Experience?ChatGPT and DeepSeek: Which AI Tool Delivers Better User Experience?
ChatGPT and DeepSeek: Which AI Tool Delivers Better User Experience?
Ava Isley
SE- Lecture 5 for software development.ppt
SE- Lecture 5 for software development.pptSE- Lecture 5 for software development.ppt
SE- Lecture 5 for software development.ppt
theworldimagine985
Projects Panama, Valhalla, and Babylon: Java is the New Python v0.9
Projects Panama, Valhalla, and Babylon: Java is the New Python v0.9Projects Panama, Valhalla, and Babylon: Java is the New Python v0.9
Projects Panama, Valhalla, and Babylon: Java is the New Python v0.9
Yann-Gaël Guéhéneuc
Advance Website Helpdesk Customer Support Ticket Management Odoo
Advance Website Helpdesk Customer Support Ticket Management OdooAdvance Website Helpdesk Customer Support Ticket Management Odoo
Advance Website Helpdesk Customer Support Ticket Management Odoo
Aagam infotech
AVG Antivirus Crack With Free version Download 2025 [Latest]
AVG Antivirus Crack With Free version Download 2025 [Latest]AVG Antivirus Crack With Free version Download 2025 [Latest]
AVG Antivirus Crack With Free version Download 2025 [Latest]
haroonsaeed605
iTop VPN Latest Version 2025 Crack Free Download
iTop VPN Latest Version 2025 Crack Free DownloadiTop VPN Latest Version 2025 Crack Free Download
iTop VPN Latest Version 2025 Crack Free Download
lr74xqnvuf
Adobe InDesign Crack – Full Version Free Download 2025
Adobe InDesign Crack – Full Version Free Download 2025Adobe InDesign Crack – Full Version Free Download 2025
Adobe InDesign Crack – Full Version Free Download 2025
sannnasaba545
Account Cash Flow Statement Report Generate in odoo
Account Cash Flow Statement Report Generate in odooAccount Cash Flow Statement Report Generate in odoo
Account Cash Flow Statement Report Generate in odoo
AxisTechnolabs
Minitool Partition Wizard Crack Free Download
Minitool Partition Wizard Crack Free DownloadMinitool Partition Wizard Crack Free Download
Minitool Partition Wizard Crack Free Download
v3r2eptd2q
A Brief Introduction About Raman Bhaumik
A Brief Introduction About Raman BhaumikA Brief Introduction About Raman Bhaumik
A Brief Introduction About Raman Bhaumik
Raman Bhaumik
Hire Odoo Developer – OnestopDA Experts.
Hire Odoo Developer – OnestopDA Experts.Hire Odoo Developer – OnestopDA Experts.
Hire Odoo Developer – OnestopDA Experts.
OnestopDA
OutSystems User Group Utrecht February 2025.pdf
OutSystems User Group Utrecht February 2025.pdfOutSystems User Group Utrecht February 2025.pdf
OutSystems User Group Utrecht February 2025.pdf
mail496323
SketchUp Pro Crack [2025]-Free Download?
SketchUp Pro Crack [2025]-Free Download?SketchUp Pro Crack [2025]-Free Download?
SketchUp Pro Crack [2025]-Free Download?
kiran10101khan
How John started to like TDD (instead of hating it) - TED talk
How John started to like TDD (instead of hating it) - TED talkHow John started to like TDD (instead of hating it) - TED talk
How John started to like TDD (instead of hating it) - TED talk
Nacho Cougil
Data Storytelling for Portfolio Leaders - Webinar
Data Storytelling for Portfolio Leaders - WebinarData Storytelling for Portfolio Leaders - Webinar
Data Storytelling for Portfolio Leaders - Webinar
OnePlan Solutions
Lecture-11-AutomatedTesting-software.pptx
Lecture-11-AutomatedTesting-software.pptxLecture-11-AutomatedTesting-software.pptx
Lecture-11-AutomatedTesting-software.pptx
ssuser39f59e
Enscape Latest 2025 Crack Free Download
Enscape Latest 2025  Crack Free DownloadEnscape Latest 2025  Crack Free Download
Enscape Latest 2025 Crack Free Download
rnzu5cxw0y
Tenorshare 4uKey Crack Fre e Download
Tenorshare  4uKey  Crack  Fre e DownloadTenorshare  4uKey  Crack  Fre e Download
Tenorshare 4uKey Crack Fre e Download
oyv9tzurtx
Elastic Search Engineer Certification - Virtual
Elastic Search Engineer Certification - VirtualElastic Search Engineer Certification - Virtual
Elastic Search Engineer Certification - Virtual
Gonçalo Pereira
Why Hire Python Developers? Key Benefits for Your Business
Why Hire Python Developers? Key Benefits for Your BusinessWhy Hire Python Developers? Key Benefits for Your Business
Why Hire Python Developers? Key Benefits for Your Business
Mypcot Infotech
ChatGPT and DeepSeek: Which AI Tool Delivers Better User Experience?
ChatGPT and DeepSeek: Which AI Tool Delivers Better User Experience?ChatGPT and DeepSeek: Which AI Tool Delivers Better User Experience?
ChatGPT and DeepSeek: Which AI Tool Delivers Better User Experience?
Ava Isley
SE- Lecture 5 for software development.ppt
SE- Lecture 5 for software development.pptSE- Lecture 5 for software development.ppt
SE- Lecture 5 for software development.ppt
theworldimagine985
Projects Panama, Valhalla, and Babylon: Java is the New Python v0.9
Projects Panama, Valhalla, and Babylon: Java is the New Python v0.9Projects Panama, Valhalla, and Babylon: Java is the New Python v0.9
Projects Panama, Valhalla, and Babylon: Java is the New Python v0.9
Yann-Gaël Guéhéneuc
Advance Website Helpdesk Customer Support Ticket Management Odoo
Advance Website Helpdesk Customer Support Ticket Management OdooAdvance Website Helpdesk Customer Support Ticket Management Odoo
Advance Website Helpdesk Customer Support Ticket Management Odoo
Aagam infotech
AVG Antivirus Crack With Free version Download 2025 [Latest]
AVG Antivirus Crack With Free version Download 2025 [Latest]AVG Antivirus Crack With Free version Download 2025 [Latest]
AVG Antivirus Crack With Free version Download 2025 [Latest]
haroonsaeed605
iTop VPN Latest Version 2025 Crack Free Download
iTop VPN Latest Version 2025 Crack Free DownloadiTop VPN Latest Version 2025 Crack Free Download
iTop VPN Latest Version 2025 Crack Free Download
lr74xqnvuf
Adobe InDesign Crack – Full Version Free Download 2025
Adobe InDesign Crack – Full Version Free Download 2025Adobe InDesign Crack – Full Version Free Download 2025
Adobe InDesign Crack – Full Version Free Download 2025
sannnasaba545
Account Cash Flow Statement Report Generate in odoo
Account Cash Flow Statement Report Generate in odooAccount Cash Flow Statement Report Generate in odoo
Account Cash Flow Statement Report Generate in odoo
AxisTechnolabs
Minitool Partition Wizard Crack Free Download
Minitool Partition Wizard Crack Free DownloadMinitool Partition Wizard Crack Free Download
Minitool Partition Wizard Crack Free Download
v3r2eptd2q
A Brief Introduction About Raman Bhaumik
A Brief Introduction About Raman BhaumikA Brief Introduction About Raman Bhaumik
A Brief Introduction About Raman Bhaumik
Raman Bhaumik
Hire Odoo Developer – OnestopDA Experts.
Hire Odoo Developer – OnestopDA Experts.Hire Odoo Developer – OnestopDA Experts.
Hire Odoo Developer – OnestopDA Experts.
OnestopDA
OutSystems User Group Utrecht February 2025.pdf
OutSystems User Group Utrecht February 2025.pdfOutSystems User Group Utrecht February 2025.pdf
OutSystems User Group Utrecht February 2025.pdf
mail496323
SketchUp Pro Crack [2025]-Free Download?
SketchUp Pro Crack [2025]-Free Download?SketchUp Pro Crack [2025]-Free Download?
SketchUp Pro Crack [2025]-Free Download?
kiran10101khan
How John started to like TDD (instead of hating it) - TED talk
How John started to like TDD (instead of hating it) - TED talkHow John started to like TDD (instead of hating it) - TED talk
How John started to like TDD (instead of hating it) - TED talk
Nacho Cougil

ORM을 맞이하는 우리의 자세

  • 1. ORM 을 맞이하는 
 우리의 자세 정병태
  • 2. 랑겔한스 : 정병태 - Web Developer
 - OKKY.KR Contributor
 - https://github.com/1angerhans - http://okky.kr/user/info/26138 - btjung@ebrain.kr
  • 3. ‘나는 SQL 이 싫어요.’
  • 5. – Wikipedia 인용 “Object-relational mapping (ORM, O/RM, and O/R mapping) in computer science is a programming technique for converting data between incompatible type systems in object-oriented programming languages.”
  • 6. – Wikipedia 인용 “객체 관계 매핑(Object-relational mapping; ORM)은 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되 지 않는 데이터를 변환하는 프로그래밍 기법이다.”
  • 7. Object-relational impedance mismatch - Data type differences - Structural and integrity differences - Manipulative difference - Transactional differences https://en.wikipedia.org/wiki/Object-relational_impedance_mismatch
  • 13. CREATE TABLE TBL_MSG ( F_GRP_ID INT(6) NOT NULL PRIMARY KEY , PTN_ID INT(6) , PRIORITY INT(6) , JOB_CODE INT(6) , FLAG_PRO INT(6) , CHAINNUM INT(6) , MASSNUM INT(6) , USERID VARCHAR(20) , CPCODE VARCHAR(20) , QTCODE VARCHAR(20) , MSGSEPER CHAR(1) , MSG_CNT INT(6) , 흔한 Legacy Table
  • 15. CREATE TABLE TBL_USER ( SEQ INT(6) NOT NULL PRIMARY KEY , USER_TYPE VARCHAR(20) , AUTH_TYPE VARCHAR(20) , USERID VARCHAR(20) , NAME VARCHAR(20) , PASS VARCHAR(20) , TEL VARCHAR(12) , CELL VARCHAR(12) , OFFICE_TEL VARCHAR(12) , EMAIL VARCHAR(200) , ZIPCODE VARCHAR(7) , ADDRESS_01 VARCHAR(200) , ADDRESS_02 VARCHAR(200) , COMPANY_NAME VARCHAR(20) , QUARTER_NAME VARCHAR(20) , STATUS VARCHAR(20) , MILEAGE INT(12) , REG_DATE DATE , PASS_CHG_DATE DATE , PASS_FAIL_CNT INT(6) ); User Contact Company Domains Auth Mileage
  • 16. CREATE TABLE TBL_USER ( SEQ INT(6) NOT NULL PRIMARY KEY , USER_TYPE VARCHAR(20) , USERID VARCHAR(20) , NAME VARCHAR(20) , PASS VARCHAR(20) , STATUS VARCHAR(20) , REG_DATE DATE , PASS_CHG_DATE DATE , PASS_FAIL_CNT INT(6) ); CREATE TABLE TBL_COMPANY ( SEQ INT(6) NOT NULL PRIMARY KEY , COMPANY_NAME VARCHAR(20) , STATUS VARCHAR(20) , REG_DATE DATE ); CREATE TABLE TBL_AUTH ( SEQ INT(6) NOT NULL PRIMARY KEY , ROLE VARCHAR(20) ); CREATE TABLE TBL_ADDRESS ( ZIPCODE VARCHAR(7) , ADDRESS_01 VARCHAR(200) , ADDRESS_02 VARCHAR(200) ); CREATE TABLE TBL_CONTACT ( SEQ INT(6) NOT NULL PRIMARY KEY , TEL VARCHAR(12) , CELL VARCHAR(12) ); CREATE TABLE TBL_MILEAGE ( SEQ INT(6) NOT NULL PRIMARY KEY , POINT INT(12) );
  • 17. public class User { Long seq; String userid; String userpass; String username; Date regDate; Company company; Address address; Contact contact; Mileage mileage; List<Auth> authorities; // Getter & Setter } public class Company { … } public class Address { … } public class Contact { … } public class Mileage { … } public class Auth { … }
  • 19. DBA
  • 20. CREATE TABLE TBL_USER ( SEQ INT(6) NOT NULL PRIMARY KEY , USER_TYPE VARCHAR(20) , USERID VARCHAR(20) , NAME VARCHAR(20) , PASS VARCHAR(20) , STATUS VARCHAR(20) , REG_DATE DATE , PASS_CHG_DATE DATE , PASS_FAIL_CNT INT(6) ); CREATE TABLE TBL_COMPANY ( SEQ INT(6) NOT NULL PRIMARY KEY , COMPANY_NAME VARCHAR(20) , STATUS VARCHAR(20) , REG_DATE DATE ); CREATE TABLE TBL_AUTH ( SEQ INT(6) NOT NULL PRIMARY KEY , ROLE VARCHAR(20) ); CREATE TABLE TBL_ADDRESS ( ZIPCODE VARCHAR(7) , ADDRESS_01 VARCHAR(200) , ADDRESS_02 VARCHAR(200) ); CREATE TABLE TBL_CONTACT ( SEQ INT(6) NOT NULL PRIMARY KEY , TEL VARCHAR(12) , CELL VARCHAR(12) ); CREATE TABLE TBL_MILEAGE ( SEQ INT(6) NOT NULL PRIMARY KEY , POINT INT(12) );
  • 21. DBA 들이 나를 향해 이렇게 외친다.
  • 22. public class MSG { int grpnum; int chainnum; String userid; String usernm; String cpcode; String qtcode; String title; String sndTitle; String cComment; String dstaddr; String callback; String msgTemplet; 흔한 Legacy Model
  • 24. <select id="selectOne" resultMap=“userMap"> select u.seq, u.userid, u.pass, u.name, u.tel, u.cel, u.email, u.company_name, u.zipcode, u.address_01, u.address_02 …. from tbl_user u where u.seq = #{seq} </select> Mybatis
  • 25. Mybatis Association <resultMap id="userMap" type=“User"> <id jdbcType="INTEGER" property="seq" column="seq"/> <result jdbcType="VARCHAR" property="userid" column="userid"/> <result jdbcType="VARCHAR" property="pass" column="pass"/> <association property="company" javaType="Company" > <result jdbcType="VARCHAR" property=“company_name" column="cpname"/> </association> <association property="contact" javaType="Contact" > <result jdbcType="VARCHAR" property=“company_name" column="cpname"/> </association> <association property="address" javaType="Address" > <result jdbcType="VARCHAR" property=“zopcode" column=“zopcode"/> <result jdbcType="VARCHAR" property=“address_01” column=“address_01"/> <result jdbcType="VARCHAR" property=“address_01” column="address_01"/> </association> <collection property="authorities" select="selectUserAuthList" fetchType="lazy" column="{seq=seq}" /> </resultMap>
  • 26. – 미상 “인간의 욕심은 끝이 없고, 같은 실수를 반복한다.”
  • 29. @Entity @Table( name = “TBL_USER" ) public class User { Integer seq; String userid; String userpass; String username; Date regDate; Company company; Address address; Contact contact; Mileage mileage; List<Auth> authorities; // Getter & Setter @Id @GeneratedValue(generator="increment") @GenericGenerator(name="increment", strategy = “increment”) @Column(name = “SEQ”) Long getSeq() { return seq; } } @Entity @Table( name = “TBL_COMPANY" ) public class Company { … } @Entity @Table( name = “TBL_ADDRESS" ) public class Address { … } @Entity @Table( name = “TBL_CONTACT" ) public class Contact { … } @Entity @Table( name = “TBL_MILEAGE" ) public class Mileage { … } @Entity @Table( name = “TBL_AUTH" ) public class Auth { … }
  • 30. CREATE TABLE TBL_USER ( SEQ INT(6) NOT NULL PRIMARY KEY , USER_TYPE VARCHAR(20) , USERID VARCHAR(20) , NAME VARCHAR(20) , PASS VARCHAR(20) , STATUS VARCHAR(20) , REG_DATE DATE , PASS_CHG_DATE DATE , PASS_FAIL_CNT INT(6) ); CREATE TABLE TBL_COMPANY ( SEQ INT(6) NOT NULL PRIMARY KEY , COMPANY_NAME VARCHAR(20) , STATUS VARCHAR(20) , REG_DATE DATE ); CREATE TABLE TBL_AUTH ( SEQ INT(6) NOT NULL PRIMARY KEY , ROLE VARCHAR(20) ); CREATE TABLE TBL_ADDRESS ( ZIPCODE VARCHAR(7) , ADDRESS_01 VARCHAR(200) , ADDRESS_02 VARCHAR(200) ); CREATE TABLE TBL_CONTACT ( SEQ INT(6) NOT NULL PRIMARY KEY , TEL VARCHAR(12) , CELL VARCHAR(12) ); CREATE TABLE TBL_MILEAGE ( SEQ INT(6) NOT NULL PRIMARY KEY , POINT INT(12) );
  • 31. DBA 들이 나를 향해 이렇게 외친다.
  • 32. CREATE TABLE TBL_USER ( SEQ INT(6) NOT NULL PRIMARY KEY , USER_TYPE VARCHAR(20) , AUTH_TYPE VARCHAR(20) , USERID VARCHAR(20) , NAME VARCHAR(20) , PASS VARCHAR(20) , TEL VARCHAR(12) , CELL VARCHAR(12) , OFFICE_TEL VARCHAR(12) , EMAIL VARCHAR(200) , ZIPCODE VARCHAR(7) , ADDRESS_01 VARCHAR(200) , ADDRESS_02 VARCHAR(200) , COMPANY_NAME VARCHAR(20) , QUARTER_NAME VARCHAR(20) , STATUS VARCHAR(20) , MILEAGE INT(12) , REG_DATE DATE , PASS_CHG_DATE DATE , PASS_FAIL_CNT INT(6) ); User Contact Company Domains Auth Mileage
  • 33. @Entity @Table( name = “TBL_USER" ) public class User { @Id @GeneratedValue(generator="increment") @GenericGenerator(name="increment", strategy = “increment”) @Column(name = “SEQ”) Integer seq; @Column(name = “USERID”) String userid; @Embedded Company company; @Embedded Address address; @Embedded Contact contact; @OneToOne( cascade = CascadeType.ALL, fetch = FetchType.LAZY) Mileage mileage; @OneToMany( cascade = CascadeType.ALL, fetch = FetchType.LAZY) List<Auth> authorities; } @Embeddable public class Company { … } @Embeddable public class Address { … } @Embeddable public class Contact { … } @Embeddable public class Mileage { … } @Embeddable public class Auth { … }
  • 35. Criteria Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.eq("seq", seq)) .setProjection( Projections.projectionList() .add(Projections.property(“zipcode")) .add(Projections.property(“address_01")) .add(Projections.property(“address_02"))) .setResultTransformer( Transformers.aliasToBean(Address.class)); Address address = criteria.uniqueResult();
  • 36. HQL
  • 37. HQL Address address = session.createQuery(“select u.zipcode, u.address_01, u.address_02 from User u where seq = :seq”, ) .setParameter("seq", seq) .setResultTransformer( Transformers.aliasToBean(Address.class)) .uniqueResult();
  • 38. ORM 에 대한 단상 • Legacy DB 도 충분히 도입 가능하다. • ORM을 염두한 디자인을 적용할 경우 생산성이 급격히 좋아진다. • Criteria는 학습이 쉽지 않다. • HQL을 쓸 때면 뭔가 손해보는 기분.. (방언 처리 라고는 하지만..) • 퍼포먼스는 사실상 문제 없다. • SQL Layer가 빠져야돼.
  • 39. ORM 은 우리가 가지고 있는 문제를 해결한 ‘결과’가 아닌 더욱 나은 방향으로 가기 위한 ‘과정’ 입니다. – 저
  • 41. SQL이 필요 없다고 RDBMS가 필요 없는건 아닐껍니다.