일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 프로그래머스
- Linux
- 자료구조
- 해결
- 주니어
- 백엔드
- 인텔리제이
- dfs
- 해시맵
- 스프링
- 문자열
- 도커
- HTTP
- 스프링부트
- spring boot
- 코딩테스트
- 이직
- 배열
- Java
- 스프링 부트
- 명령어
- IntelliJ
- 스타트업
- spring
- 구름LEVEL
- docker
- HashMap
- 개발자
- 구현
- bfs
- Today
- Total
마이의 개발 블로그
[Spring] ORM(Object-Relational Mapping)을 사용하는 이유 본문
배경
ORM의 장단점을 알아보고, 어떤 상황에서 사용되는지 알아보려고 합니다.
ORM의 장점
- 객체지향적 접근: 객체와 DB를 맵핑시켜 객체지향 언어로 DB를 조작할 수 있게 됩니다.
- 추상화: DB를 추상화하여 접근하므로 구체적인 SQL 지식 없이 간편한 DB 조작이 가능해집니다.
- 자동화: 반복적인 CRUD 작업을 자동화할 수 있습니다. 매번 직접 SQL을 작성할 필요가 없기 때문입니다.
- 유지보수성 향상: DB 모델이 변경되거나 하는 경우 변경된 부분들에 대한 수정이 상대적으로 용이해집니다.
- DB 독립성: ORM을 거쳐 DB에 접근하여 DB에 대한 의존도가 낮아집니다. 만약 DB 벤더가 변경되더라도 그에 따른 제반 작업(SQL 수정 등)을 할 필요가 없어집니다.
- 성능 향상: 쿼리 최적화나 캐싱이 기본적으로 제공되어 성능상의 이점을 얻을 수 있다는 장점이 있습니다.
-> ORM을 사용하면 개발자가 DB와 연관된 작업에 신경을 덜 쓰게 되어 높은 생산성을 얻을 수 있습니다.
ORM의 단점
- 높은 학습 곡선: ORM을 이해하고 사용하기까지의 학습 기간이 필요합니다. ORM을 적절하게 사용하기 위해서는 SQL과 ORM 둘 다를 잘 알아야 합니다. 직관적인 SQL에 비해 ORM에는 눈에 보이지 않는 영역에서 이루어지는 동작이 많습니다.
- 복잡한 쿼리 작성의 어려움: 상황에 따라 복잡한 쿼리의 경우 직접 SQL을 사용하는 것이 더 효과적입니다.
- 성능 문제: 잘못된 사용 시 성능 문제가 발생할 수 있어 주의를 기울일 필요가 있습니다.
-> 학습곡선이 높고, 복잡한 쿼리를 다룰 경우 ORM이 커버하지 못하거나 성능 문제가 발생될 수 있습니다.
ORM 도입할 때 생각해볼만한 질문들
프로젝트 수행과 기술적인 제약 둘 다를 고려하여 ORM의 도입이 적절한 선택인지를 고민해야 합니다.
프로젝트 수행 관점:
- 팀에게 ORM 개발 역량이 있는지?
- 향후 유지보수에 필요한 인력 수급이 용이한지?
- 학습에 필요한 시간적 여유가 주어지는 프로젝트인지?
- 고객 요구사항의 변경(에 따른 DB의 변경)이 잦은 프로젝트인지?
기술적인 제약을 고려한 관점:
- 극한의 성능을 이끌어내야하는 프로젝트인지?
- 복잡한 쿼리가 많이 필요한 프로젝트인지?
- DB 벤더에 종속적인지? 특정 DB벤더에서만 제공하는 기능을 사용해야하는지?
ORM을 사용하는 이유
위의 내용들을 종합해보면, ORM의 사용 이유는 한 마디로 생산성 향상일 것입니다. 학습 곡선이 조금 높을 수는 있지만 잘만 사용한다면 불필요한 작업을 줄여주어 비즈니스 로직에 집중할 수 있게되고 개발 시간을 단축시킬 수 있기 때문입니다. 쿼리를 직접 작성하지 않기 때문에 실제로 작성되는 코드의 양도 적어지고 개발속도가 더 빨라지는 경험을 할 수 있습니다. 그리고 ORM으로만 해결하기 어려운 문제는 네이티브 SQL을 사용하여 보완이 가능하기 때문에 위에 언급된 단점들을 상쇄시킬 수 있습니다. 오히려 '이 프로젝트에 ORM이 얼마나 적합한지?'의 문제를 판단하는 일이 더 어려운 문제라고 생각됩니다.
Note
- 많은 채용공고들이 ORM 사용 경험을 필수 요건으로 꼽는다. 이미 전세계적으로 활발히 사용되던 기술이었고 한국에 조금 늦게 퍼진 감이 없지않아 있는 듯하다.
- N+1 문제, 지연로딩과 즉시로딩, 캐싱 등은 별도 정리 예정
- 한 번쯤 보면 좋을 ORM에 대한 갑론을박(8년 전 김영한님 작성글): https://okky.kr/questions/286812
'개발지식 > Spring' 카테고리의 다른 글
[IntelliJ] 스프링부트 프로젝트 JVM Heap 메모리 크기 지정하기 (0) | 2024.02.21 |
---|---|
[Spring] JPA, Hibernate, ORM, Spring Data JPA 사이의 관계 정리 (2) | 2023.10.10 |
[Spring] 스프링 MVC(Spring MVC) (0) | 2023.09.15 |
[Spring] 스프링 프레임워크(Spring Framework)와 스프링 부트(Spring Boot) (0) | 2023.09.14 |
[Spring] 왜 스프링 프레임워크(Spring Framework)를 사용할까? (0) | 2023.09.14 |