본문 바로가기

TIL & WIL

WIL_220606_ORM, JPA, SQL 그리고 꿈

어느덧 정신없이 달려오다보니 부트캠프 29일차가 되었다.

하루에 15시간 이상 스프링 공부를 하는 이런 경험을 어디서 또 해볼까...ㅋㅋ

압축성장 할 수 있는 좋은 기회라고 생각하고 정말 열심히 하고 있다.

그리고 ㅎㅎ 오늘을 기준으로 인생의 꿈이 제대로 다시 설정되었다.

적성에 맞는 일을 해야지. 나는 정말로 멋진, 유능한, 개발자가 되고 싶다.

그리고 그 Core 기술을 가지고 창업도 해볼 것이고, 강의도 해보고 싶고,

만들었던 주식, 코인 시스템 트레이딩 프로그램도 더 고도화 시켜서 돈도 많이 벌고싶다!(솔직)

지금까지 열심히 안한건 절대 아니지만, 오늘부터는 새출발 하는 마음으로 더

열심히 공부하고 도전해야겠다. 화이팅!

 

자, 일단! 모든 일을 오늘을 어떻게 잘 사는지에 따라 달라진다.

그런 의미에서 오늘도 배운 내용을 한번 정리해보자.

 

저번 주차는 스프링 숙련 주간이었다. 

그 중 ORM, JPA, SQL 등의 개념을 한번 정리해보고자 한다.

 

#ORM

  • Object-Relational Mapping (객체와 관계형 데이터베이스 매핑, 객체와 DB의 테이블이 매핑을 이루는 것)
  • 객체가 테이블이 되도록 매핑 시켜주는 프레임워크이다.
  • 프로그램의 복잡도를 줄이고 자바 객체와 쿼리를 분리할 수 있으며 트랜잭션 처리나 기타 데이터베이스 관련 작업들을 좀 더 편리하게 처리할 수 있는 방법

현재 Spring 진영에서는 ORM 중 JPA가 대세가 되고 있다고 하는데,

기존에는 MyBatis라는 SQL-Mapper를 많이 사용했었다.

기억을 되짚어보면 회사에서 운영했던 웹사이트는 MyBatis를 사용하여 Native SQL문을 직접 작성했었고,

DAO, DTO등을 이용하여 직접 DB 저장 하는 것 까지 작업을 해주었던 사이트였다.

그래서 처음 접했을 때 너무 복잡하고 어렵게만 느껴졌었던 기억이 난다.

SQL을 충분히 다룰 수 있다면 익숙하게 쓸 수 있는 프레임워크긴 하지만

개발자가 비교적 반복적인 코드를 계속 써야한다는 것이 불편한 일이 아니었을까 싶다.

 

그렇다면, 대세가 되고 있다는 JPA란 무엇일까?

 

#JPA

  • Java Persistence API(자바 ORM 기술에 대한 API 표준 명세)
  • ORM을 사용하기 위한 인터페이스를 모아둔 것이라고 볼 수 있다.
  • JPA는 인터페이스 덩어리이며 실제 구현체는 Hibernate이다.
  • 객체 지향적인 코드로 인하여 비즈니스 로직에 더 집중할 수 있게 도와준다.
  • SQL을 직접 작성하지 않고 객체를 기준으로 동작하기 때문에 유지보수가 쉽다.
    (컬럼 수정 시, 해당 모델 객체 필드만 수정해주면 끝. 와우!)
  • DBMS에 대한 코드 종속성이 줄어든다.
  • 쿼리 문법에 대한 오류를 런타임 시점이 아니라 컴파일 시점에 미리 알 수 있다.

<JPA와 Hibernate의 상속 및 구현 관계를 나타낸 그림>

JPA의 핵심인 EntityManagerFactory, EntityManager, EntityTransaction 인터페이스를

Hibernate에서는 각각 SessionFatory, Session, Transaction으로 상속받아 구현하고 있다.

 

Hibernate는 JPA의 구현체이므로 JPA를 위해 꼭 사용해야하는 것은 아니지만, Hibernate만큼 성숙한 라이브러리를

찾기는 어렵다고 한다.

 

Hibernate가 SQL을 직접 사용하지 않는 다고 해서 JDBC API를 사용하지 않는 것이 아니며,

Hibernate가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있다.

<참고 블로그>

https://bravenamme.github.io/2020/07/08/jpa/

 

# Spring Data JPA

Spring Data JPA는 Spring에서 제공하는 모듈 중 하나로, 개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와준다.

(정말 이래서 스프링이 장수할 수 있지 않나 싶다...)

Spring Data JPA 를 사용하여 개발하면 위에서 말한 EntityManager 를 직접 다뤄서 개발하지 않는다.

이는 Spring Data JPA에서 JPA를 추상화시킨 Repository 인터페이스를 제공하기 때문에 가능한 일이다.

사용자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에

적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.

 

 

이것저것 쓰다보니 복잡하지만, 결국에는 MyBatis에서 불편했던 부분을 상당히 간편하게 해결해주고

유지보수를 용이하게 해준다는 것이 중요하다.

그래서 전 세계적으로 JPA가 Spring을 사용하는 개발자들 사이에서 대세가 되고 있다는 것!

 

 

하지만 사용자 입장에서 간편하다는 것은 그만큼 소프트웨어가 사람이 해야할 일을 많이 대신해주고 있다는 뜻이기 때문에

그 내부의 동작 구조를 모르고서는 이해가지 않는 부분이 많을 것이다. 

동작 구조 이외에도,

SQL(Structured Query Language) 언어를 비롯하여,

자바 프로그램이 데이터베이스와 연결되어 데이터를 주고 받을 수 있게 해주는 프로그래밍 인터페이스인

JDBC(Java Database Connectivity),

문서를 작성할때 워드 프로그램이 필요하듯 데이터베이스를 관리할 수 있게 해주는 소프트웨어인

DBMS(Database Management System, MySQL/PostgreSQL/Oracle/SQLite/MariaDB 등)에 대한

전반적인 이해가 전제되어야 한다고 생각한다.

 

 

자 오늘의 WIL은 여기서 끝!

열심히 공부하고 달려보자 :)