728x90
반응형
📚 참고자료
- 유튜브 채널 [우아한 Tect] - 10분 테코톡 아마찌의 ORM vs SQL Mapper vs JDBC
https://www.youtube.com/watch?v=VTqqZSuSdOk&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=66
🤔 영속성(Persistence)이란?
- 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성
- 객체지향 프로그램에서 객체의 상태는 단지 메모리에서만 존재하고 프로그램이 종료되면 휘발하는 형태
=> 영속성을 가지지 않은 상태
=> 객체의 상태를 DB에 저장하면서 객체에게 영속성을 부여함
- 위 사진은 Mark Richards의 소프트웨어 아키텍처 패턴 => 이미지링크
- Persistence 계층에서 Domain Model 계층에 영속성을 부여하는 역할을 합니다.
- JDBC, SQL Mapper로 Persistence Layer를 구현할 수 있습니다.
⏺ JDBC만을 이용하여 Persistence Layer 구현하기
JDBC란?
- Java Database Connectivity의 약자
- 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API
- 자바 애플리케이션에서 DBMS의 종류에 상관없이, 하나의 JDBC API를 이용해 DB 작업을 처리
- 각각의 DBMS는 이를 구현한 JDBC 드라이버를 제공한다.
JDBC의 단점
- 간단한 SQL을 실행하는 데도 중복된 코드를 반복적으로 사용
- Connection과 같은 공유 자원을 제대로 릴리즈(반환) 해주지 않으면 시스템의 자원이 바닥나는 버그 발생
- DB에 따라 일관성 없는 정보를 가진 채로 Cheked Exception (SQLException)처리
- Cheked Exception이란?
=> Checked Exception은 컴파일 단계에서 확인 가능한 예외이다.
=> 다른 말로는 "Compiletime Exception"이라고 한다.
=> Checked Exception은 try/catch로 감싸거나 throw로 던지는 처리를 반드시 해주어야 한다.
=> 예외처리를 컴파일러가 강제하는 것이다.
- Cheked Exception이란?
⏺ Persistence Framework로 Persistence Layer 구현하기
SQL Mapper란?
- 자바 Persistence Framework 중 하나입니다.
- SQL을 직접 작성합니다.
- SQL 문과 객체(Object)의 필드를 매핑하여 데이터를 객체화
SQL Mapper의 장점
- 쿼리 수행 결과와 객체의 필드를 맵핑 & RowMapper 재활용
- JdbcTemplate가 JDBC에서 반복적으로 해야 하는 많은 작업들을 대신해줌
SQL Mapper에 속하는 대표적인 프레임워크로 MyBatis가 있습니다.
⏺ MyBatis란?
- 반복적인 JDBC 프로그래밍을 단순화합니다.
- SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL을 분리하여 관리합니다.
- JDBC만 사용하면 결과를 가져와서 객체의 인스턴스에 매핑하기 위한 많은 코드가 필요하겠지만,
마이바티스는 그 코드들을 작성하지 않아도 되게 해 줍니다. - 동적 쿼리를 작성할 수 있습니다.
- 동적 쿼리란?
=>
- 동적 쿼리란?
- 위 이미지는 마이바티스가 데이터를 Access 하는 순서를 나타내는 것입니다.
- 스프링 부트에서 구현할 때 보라색 부분인 Mapper Interface와 Mapping File을 구현하게 되면
자연스럽게 객체의 필드와 SQL문이 매핑되게 됩니다. - Mapper Interface에 대한 구현체를 우리가 구현하지 않아도 마이바티스에서 자동으로 생성하게 됩니다.
마이바티스의 장점
- 자동으로 Connection 관리를 해주면서 JDBC를 사용할 때의 중복 작업 대부분을 없애준다.
- 복잡한 쿼리나 다이나믹하게 변경되는 쿼리 작성이 쉽다.
- 관심사 분리
- DAO로부터 SQL문을 분리하여 코드의 간결성 및 유지보수성을 향상할 수 있습니다.
😓 JDBC와 마이바티스의 단점
- SQL을 직접 다룸으로 문제점이 생기게 된다.
- 특정 DB에 종속적으로 사용하기 쉽습니다.
- 테이블 마다 비슷한 CRUD SQL 작성은 DAO 개발이 매우 반복되는 작업입니다.
- 테이블 필드가 변경될 시 이와 관련된 모든 DAO의 SQL문, 객체의 필드 등을 수정해야 합니다.
- 코드상으로 SQL과 JDBC API를 분리했다 하더라도 논리적으로 강한 의존성을 가지고 있습니다.
- SQL문을 직접 작성하면 SQL에 의존적인 개발을 하게 됩니다.
- 데이터 베이스에 항상 의존 관계를 가지게 됩니다.
⏺ ORM이란?
- 객체와 관계형 데이터베이스를 매핑하는 것
- 객체간의 관계를 바탕으로 SQL문을 자동으로 생성하고 직관적인 코드(메서드)로 데이터를 조작 할 수 있습니다.'
- SELECT * FROM user; -> user.findAll();
- ORM의 대표적인 예로 JPA가 있습니다.
ORM의 장점
- 패러다임 불일치 문제 해결
=> 객체지향 언어가 가진 장점을 활용할 수 있습니다. - 생산성
=> 지루하고 반복적인 CRUD 용 SQL을 개발자가 작성하지 않아도 됩니다. - 데이터 접근 추상화, 벤더 독립성
=> 데이터베이스 벤더마다 미묘하게 다른 데이터 타입, SQL을 손쉽게 해결 - 유지보수
=> 필드 추가, 삭제 시 관련된 CRUD 쿼리를 직접 수정하지 않고, 엔티티를 수정하면 됩니다.
ORM의 단점
- 복잡한 쿼리 사용이 어렵습니다.
- JPA에서는 SQL과 유사한 기술인 JPQL을 지원합니다.
- SQL 자체 쿼리를 작성할 수 있도록 지원합니다.
- SQL Mapper와 혼용해서 사용도 가능합니다.
😃 느낀점
- 현재(작성일) 사이드 프로젝트에서 SQL Mapper인 마이바티스를 사용하고 있습니다.
- 직접 사용해보면서 장점과 단점을 생각해볼 예정입니다.
- SQL Mapper를 사용하는 프로젝트를 끝낸 후에 JPA를 사용하는 프로젝트 진행
- 부트캠프에서 Spring Data JPA를 사용했지만 너무 얕게 공부했다는걸 영상을 보고 알게되었습니다.
- JPA를 김영한님 책과 인프런 강의를 보면서 공부할 예정입니다.
📝 해야할 것!
- 사이드 프로젝트를 통해 SQL Mapper(마이바티스)의 장점과 단점을 사용하면서 알아가기
- 사이드 프로젝트가 끝난 후에 JPA에 대한 공부를 진행
- JPA 공부를 통해 ORM에 대한 개념을 이해하고 사용하는 이유와 장단점을 알아가기
- JPA에서 SQL을 처리하는 구조를 공부하면서 사용해보기
반응형
'프로그래밍언어 & 프레임워크 > 스프링(Spring)' 카테고리의 다른 글
쿼리DSL을 사용하는 이유는?(QueryDSL) (0) | 2022.05.01 |
---|---|
[테코톡] 트랜잭션(Transaction) (0) | 2022.04.02 |
[테코톡] TDD와 단위테스트 (0) | 2022.03.17 |
[팀프로젝트] 스프링 Cors 처리(WebMvcConfigurer) (0) | 2022.02.27 |
[팀프로젝트] Spring 2.6 이상에서 OpenAPI 3.X 사용하기(SpringDoc) (0) | 2022.02.27 |