본문 바로가기
programming/SpringBoot

스프링부트3 리포지토리 역할 springboot3 @Repository SQL 쿼리는 익혀두자

by 개코 - 개발과 코딩 2024. 8. 12.

리포지토리는 스프링부트3가 DB와 연동하여 데이터를 읽기, 쓰기, 가공 등 CRUD가 가능하도록 한다. 클래스를 @Repository 어노테이션으로 지정하여 사용한다. 리포지토리는 JPA, JPQL, QueryDSL, MyBatis 를 사용할 수 있으며, 어떤 것을 사용할지는 자신에게 편한 것을 선택하는 것이 좋다. 스터디를 해보면 알게지만, 각각의 장점도 있고, 단점도 있으며, 각 기능마다 한계가 있다.

스프링부트3 리포지토리 역할 springboot3 @Repository
SQL 쿼리는 익혀두자

프로그램을 만들다보면 데이터를 저장하고 가공하고 서비스 할 필요를 느낀다.

데이터베이스를 이를 해결해주며 스프링부트3 ( SpringBoot3 ) 는 리포지토리( Repository ) 를 사용하여 데이터베이스와 연결하여 데이터를 보관하고, 읽고, 가공한다.

스프링부트3에서 데이터베이스에 연결하고 저장된 데이터를 사용하려면 Repository 를 사용하면 되며, @Repository 어노테이션( annotation )을 사용한다.

기존 스프링MVC에서 사용하던 mapper 방식도 있지만 스프링부트3는 리포지토리를 사용할 때 JPA, JPQL, QueryDSL 이란 기술을 사용한다.

mapper 방식에 익숙한 사람들이라면 이것을 학습하는데 조금 난해할 수도 있는데, 이는 쿼리를 직관적으로 작성하지 않고 코드상에서 데이터를 편하게 사용하기 위해 만들어진 하나의 라이브러리이기 때문이다.

데이터 모델 엔티티 / Entity

프로그램을 개발할 때 데이터를 가공하기 위해 클래스를 만들 수 있다.

단순히 변수만 있는 클래스로 보통 데이터 모델이라 불린다.

스프링부트3( SpringBoot3 )에서는 이것을 엔티티( Entity )라고 한다.

데이터를 저장하고 가공하기 위한 하나의 데이터 그릇이라 생각하면 된다.

스프링부트3에서 리포지토리( Repository )를 사용할 때 함께 사용한다.

리포지토리가 DB와 연동되고 필요한 데이터의 형태에 맞게 상황에 따라 엔티티의 형태는 달라진다.

클래스에 변수만 있는 엔티티가 낯설수도 있는데,
리포지토리가 DB와 연동하여 데이터를 읽기, 쓰기 하기 위한 그릇 정도라고 생각하자.

리포지토리를 사용하기 위한 방법

스프링부트3 ( SpringBoot3 ) 에서 DB와 연동하여 데이터를 가공하기 위해선 리포지토리( Repository ) 를 사용한다.

리포지토리는 JPA, JPQL, QueryDSL 과 mybatis 를 사용할 수 있다.

자신이 편한 것을 사용할 수 있지만, 한계들이 있다.

직접 코딩을 하고 느껴봐야 알 수 있는 부분들이다.

어떤 이들은 JPA를 만능에 가깝다고 생각하지만, 음~ 글쎄다. ERP 또는 MES 와 같은 복잡도가 있는 프로그램 개발시에는 불편하며, 불필요한 코드가 늘어날 수 있다.

차라리 직관적 Query 를 사용하는 것보다 못할 수 있다.

하지만, 간단한 테이블에 대한 CRUD에 대해선 특별히 query 를 사용하지 않아도 DB의 데이터를 읽기, 쓰기를 할 수 있다.

리포리토리 비교

지금은 JPA 와 함께 DB를 연동하여 프로그래밍을 하는 경우들이 많다.

과거의 직관적인 SQL 쿼리를 사용하지 않고 코드를 사용하기 때문에 편한면도 있고, 메서드를 자동으로 만들어 준다는 점에서 신세계를 경험할 수 있지만, 복잡한 쿼리를 해야 되는 경우 오히려 독이 된다.

차라리 직관적인 SQL 쿼리를 사용하는 것보다 못한 경우들도 발생한다.

솔직히 JPA, JPQL, QueryDSL 에 대해 직접 스터디를 하고 느껴보는 것이 좋다.

일단 비교를 해보자.

  • JPA
    객체, 관계 매핑 ORM 구조이며 별도의 코딩이 필요없이 CRUD가 가능하다.
    다만, 동적 쿼리와 같은 복잡도가 발생할 경우 사용하는데 불편함이 생긴다.
  • JPQL
    객체를 이용해 쿼리를 작성하여 직관적인 개발을 할 수 있다.
    직관적인 쿼리를 사용할 수 있기에 동적 쿼리가 가능하지만, 가독성과 디버깅에 불편함이 있다.
  • QueryDSL
    JPA, JPQL 의 단점을 보완한 라이브러리.
    유연하고 동적 쿼리에 유연함을 보인다.
    사용함에 있어 별도의 스터디가 필요할 수 있다.

MyBatis Mapper

JPA 때문에 사용도가 묻힌 것이 마이바티스( MyBatis ) 이다.

어떤 분의 경우 쿼리(  Query )를 사용하는 것을 상당히 불편하게 생각했다.

DB 프로그래밍을 하는데 쿼리를 사용하는 것을 불편하게 생각하는 것이 모순이긴 하지만 굳이 대답하진 않았다.

스스로 해보고 느껴보지 않으면 모르기 때문일 수도 있다.

ERP, MES, CMS 와 같은 데이터 드리븐이 필요한 경우 JPA는 개발자들에 지옥을 보여줄 수도 있다.

마이바티스는 SQL 쿼리를 XML 형태로 만들어 DB와 연동하여 사용하는 방식이다.

쿼리를 따로 모아놓고 사용할 수 있고, 직관적인 쿼리를 볼 수 있기 때문에 업무 프로세스의 흐름을 한번에 파악할 수 있다.

굳이 디버깅을 하지 않아도 테이블의 관계를 쉽게 파악할 수 있다.

직관적인 쿼리를 사용하기 때문에 자유도가 높고, 유연하다.

리포지토리 어떻게 사용할까

프로그램은 어떻게 만들어질까?

단순히 JPA 하나만 공부해 본 사람이라면 신세계가 느껴졌을 것이다.

본인 또한 그랬다.

하지만, 연관된 테이블들의 join 관계만 들어가도 한계가 있었다.

그렇다보니 코드는 늘어났고, 스파게티 코드가 되었으며 주석은 주석대로 늘어나기 시작했다.

그렇다보니 JPQL, QueryDSL, MyBatis 까지 스터디를 하게 되었는데

결론은

나한테 맞는 개발하기 편한 것 선택하는 것이 최고이다.

본인의 경우라면 직관적인 쿼리를 볼 수 있는 마이바티스가 편하다.

딱히, 디버깅도 필요없고, 쿼리만 보면 테이블의 관계까지 알 수 있기 때문이다.

필요한 기술 / SQL을 익히자.

리포지토리( Repository )는 스프링부트3( SpringBoot3 )에서 DB와 연동하여 데이터를 읽기, 쓰기, 가공을 할 수 있도록 해 주는 것이다.

DB를 사용한다는 것은 SQL 쿼리( Query )를 사용한다는 것이다.

쿼리를 사용함으로써 테이블들의 관계를 살펴볼 수 있고, 화면마다 필요한 데이터를 선택할 수 있다.

SQL을 모르고 리포지토리를 사용해 DB에 접근하고 데이터를 가공한다는 것은 개발자에 있어 어려운 과정이 될 수 있다.

최소한 MySQL 정도는 익혀두는 것이 좋다.

반응형

댓글