인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

blackhole124님의 프로필 이미지

작성한 질문수

스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

댓글 수 구현

query DSL 대신 Native Query를 사용하시는 이유가 있으신가요?

해결된 질문

작성

·

179

0

  • 학습 관련 질문을 최대한 상세히 남겨주세요!

  • 고민 과정도 같이 나열해주셔도 좋습니다.

  • 먼저 유사한 질문이 있었는지 검색해보세요.

  • 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

안녕하세요

강의 잘 듣고 있는 학생입니다.

다름이 아니라,

 

강의에서

query DSL 대신 Native Query를 사용하시는 이유가 있으신가요?

 

현업에서는 query DSL 대신 Native Query를 더 많이 사용하는걸까요??

 

 

답변 2

2

쿠케님의 프로필 이미지
쿠케
지식공유자

blackhole124님, 안녕하세요!

 

QueryDSL은 팀의 선택일 뿐이고, 이 부분에 크게 의미를 둘 필요는 없습니다.

그냥 팀의 선택에 의해 사용하고 싶으면 사용하는 것이고, 그렇지 않으면 굳이 사용하지 않아도 됩니다.

그리고 조금 조심스러운 의견일 수 있는데,

개인적으로는 JPA 자체를 선호하진 않고, 그렇기 때문에 QueryDSL도 잘 사용하지 않습니다.

제 주변에서도 실무에서는 JPA를 잘 선호하진 않더라고요. 복잡한 시스템 다루는 실무자 사이에서는 정말 거의 못본 것 같습니다.

러닝커브나 생각치 못한 문제를 대비해야하는 것에 비해 딱히 이점이 없다는 생각도 있습니다..!

외에도 나름의 이유가 있는데, 이것까지 모두 서술하자면 엄청나게 길어질 수 있기 때문에, 가까운 미래에 직접 느끼시지 않을까 싶습니다!

그리고 표현이 조금 이상할 수 있는데, 최근 홍보가 너무 잘된 느낌도.. 있습니다..! (명강의가 있다보니)

그래서 특히 주니어나 취준생분들이 사고 자체가 JPA에 종속적인 경우가 많더라고요.

결국 JPA는 데이터베이스를 애플리케이션에서 편하게 사용하기 위한 클라이언트 도구일 뿐입니다. 

그런데 꼭 ORM이 아니더라도 그냥 매퍼 정도로도 충분한 상황이 많고요.

JPA가 항상 정답은 아니고, 더 편하고 간단한 기술도 많습니다.

강의에서 JPA는 요즘 자주 거론되는 기술이다보니 채택했을 뿐입니다..!

 

강의에서 native query를 사용한건 이유가 있는데요,

“데이터베이스를 모르고 JPA만 먼저 배우는 상황”을 너무 자주 봤습니다.

그래서 실제로 쿼리가 어떻게 만들어지는지도 모르고, 어떻게 동작하는 건지, 최적화는 어떻게 하는건지(Pageable 쓰면서 쿼리 만들어지는걸 디버깅해보시면 아시겠지만, DB마다 최적화된 쿼리를 만들어주진 않습니다), 연관 관계는 어떻게 맺어야 하는지 전혀 모르는 경우가 많더라고요.

결국 JPA도 DB 쿼리로 만들어주는 클라이언트 라이브러리일 뿐이고,

데이터베이스를 이해하고 있으면, 이걸 학습하는게 어려운건 아니거든요.

강의에서만큼은 DB 관점에서 직관적으로 드러나기를 원했고, 그래서 native query를 채택했습니다!

 

다른 수강생 분들한테도 비슷한 질문들이 많았는데요, 참고차 일부 링크 달아둡니다!

https://www.inflearn.com/community/questions/1520844

https://www.inflearn.com/community/questions/1504157

https://www.inflearn.com/community/questions/1483843

https://www.inflearn.com/community/questions/1516840

 

혹시 더 궁금한 점 있으시면 편히 문의 주세요!

blackhole124님의 프로필 이미지
blackhole124
질문자

댓글 감사합니다.

안그래도 "실무에서 JPA는 잘 사용하지 않는 추세다"라는 말은 듣긴 했었네요 ..

 

그러면 몇가지 질문 드리고 싶은게 있습니다.

1.현재 백엔드 개발자를 희망하는 학생인데, 경쟁력 있는 개발자가 되기 위해서 어떤 부분에 집중해서 학습을 하고 개발을 하는게 좋은지 쿠케님의 생각을 알 수 있을까요?

개발을 시작한지는 얼마되지 않아, 지금까지 유명한 스프링 강의를 수강하고 학교에서 여러 프로젝트를 진행했지만, 하다보니 그 다음 스텝이 분명히 있는데 그게 무엇인지 잘 감이 잡히지 않습니다.

그래서 여기저기 찾아보다 "대규모 시스템 개발"이라는 쿠케님 강의까지 넘어왔지만, 강의를 들으면 들을수록 학습해야될 분량이나 분야가 너무 많다고 느껴지네요

예를 들어, "현업에 가면 CS가 중요하다더라"라는 말을 들어도 CS가 어디서 어떻게 왜 중요한지에 대한 구체적인 상황이나 학습 방향이 주어지지 않아서 좀 어렵더라구요

결론만 이야기하면 어떤 방향으로 어떻게 초점을 맞춰서 학습을 하고, 개발을 해야되는지 갈피를 잡기가 어렵습니다.

개발 관련 책을 읽어야 되는지, CS를 보강해야되는지 ,프로젝트나 현업으로 가서 여러 상황에 부딪치고 해결하는 과정에서 자연스럽게 학습하는 과정이 좋은지 어렵네요

 

  1. 대규모 시스템을 다루는 개발자들은 JPA나 Query DSL을 잘 사용하지 않는다고 말씀하셨는데, 그러면 보통 어떤 기술을 사용하는걸까요?
    거기에 맞게 학습을 하고싶습니다 !




    강의 항상 잘 보고 있습니다. 감사합니다 즐거운 주말 되세요

     

쿠케님의 프로필 이미지
쿠케
지식공유자

blackhole124님, 안녕하세요!

 

1.

일단 전 무조건 기본기를 공부하라고 합니다!

CS 이론(자료구조/운영체제/네트워크/데이터베이스/컴퓨터구조/알고리즘 등)을 깊게 학습하고, 알고리즘 문제도 많이 풀어보시면 좋겠습니다.

새로운 기술을 배우더라도, 어차피 밑바닥 개념은 동일하기 때문에 기본기만 튼튼하면 학습하고 적용하는게 크게 어렵지 않습니다.

대충 동작 방식이나 설정만 몇 개 봐도, 어떤 식으로 만들어졌을지 감이 오거든요.

원래 이론적인 부분은 왕도가 없는 것 같습니다.

그냥 책 펴놓고 지긋하게 공부하는 수밖에 없더라고요.

기본기는 결국 시간을 많이 쓰면서 암기하는 수밖에 없습니다.

처음에는 무작정 공부하는게 어려울 수 있지만, 슬슬 내용들이 이해가 되는 시점부터는 각 과목들이 다 연결되고 비슷한 내용을 말한다는걸 알게 됩니다.

예를 들면, 결국 인덱스도 자료구조에서 배우는 트리 기반으로 만들어진 것이고,

디스크와 메모리의 차이도 컴퓨터구조에서 학습하는 내용이고,

메모리 계층 구조라는 레지스터/메모리/디스크 간에 I/O 속도를 해결하기 위한 전략과 캐시라는 개념도 이미 운영체제와 컴퓨터 구조에서 배우는 것이고,

동시성을 해결하는 방법도 운영체제와 컴퓨터구조에서 배우는 것이고요.

또, 위 내용들이 다 데이터베이스에 녹아있다는 사실은 이미 느끼셨을 것 같습니다.

애플리케이션 시스템 개발도 마찬가지입니다.

결국 컴퓨터와 OS 위에서 동작하는 시스템을 개발하는데, 기본기가 없으면 좋은 시스템을 만들 수가 없습니다.

이건 꼭 대규모 시스템을 말하는 것도 아니고요.

기본기가 있으면 문제 상황에 원인과 해결 방법을 쉽게 찾을 수 있는 상황도 많습니다.

 

제 강의도 보면서 느끼셨겠지만, 결국 기본기 기반으로 시스템을 쌓아올려 나가는 과정입니다.

이렇게 못 느끼셨다면, 어떻게든 CS 이론과 연관 지어보시는 것도 추천드립니다!

그 과정에서 부족한 부분에 대해서 인지하고 추가로 공부해 나갈 수도 있거든요.(강의 소개에서도 이 부분에 대해서 언급합니다)

요구사항에 따라서 비즈니스 로직을 풀어내는 것도 결국 문제 해결 방법을 찾아가는 과정이고요.

문제 해결에 대한 부분은 알고리즘 문제 풀다 보면 잘 훈련이 되더라고요.

특히 알고리즘 풀다 보면 반례 찾고 디버깅을 엄청나게 하게 되는데, 이게 참 고통스럽지만 엄청나게 유의미한 과정인 것 같습니다.

 

강의를 들으면 들을수록 학습해야 될 분량이나 분야가 너무 많다고 느껴진다는 말씀 충분히 이해합니다..!

그런데 강의 내용 기준으로는 취준생 분들 입장에서는 꼭 다 알 필요는 없습니다.

솔직히 강의 내용은 정말 어려운 편에 속하거든요.

취준생 분들에게만 어려운게 아니라, 아무리 연차가 많은 현업자더라도 기본기와 경험이 없으면 모르는 내용입니다.

강의 소개에서도 취준생/주니어가 아니더라도 그냥 모르면 들어도 좋다고 합니다.

그런데 현실적으로 연차가 많아지면 이미 직장도 안정적이고, 특정 기술과 도메인에 익숙해지고, 사고가 특정 분야에만 갇히는 경우가 많아서 뭘 모르는지 잘 모르게 되기도 하죠..! (저도 마찬가지입니다)

그래서 강의 수강생들이 요즘 취업 난으로 인해 변별력을 찾고자 하는 취준생/주니어 분들에게 많이 쏠리는 느낌도 있습니다.

강의는 반드시 취준생/주니어 분들이 대상자라기 보단, “대규모”란 취지에 맞게, 정말 대규모를 상정하고 만든거라는 점을 참고해주시면 될 것 같습니다.

그래서 취준생에게는 강의가 어렵고 알아야 할게 너무 많다고 느껴지는게 당연합니다.

개인의 경험에 따라 다르겠지만, 대부분의 현업자들도 모르는 내용이거든요.

 

강의에 대해 딱 취준생 분들 기준으로 정리해서 말하면,

게시글(인덱스 동작 원리)까지만 알아도 충분하다고 생각하네요.

대댓글 부분은 계층형 데이터를 병목없이 제대로 만드는걸 인터넷(블로그/타 강의 등)에서 본 적이 없어서 직접 만들어본거라 굳이 다 이해하실 필요는 없고,

심화까지 하자면 좋아요(DB 락, 격리 레벨, 동시성, 트랜잭션에 대한 이해)/조회수(메모리와 디스크 I/O 차이에 대한 이해)까지만 알아도 충분할 것 같습니다.

인기글/최적화 전략은 흥미로울 수 있지만 취준생 분들에게는 과할 수 있습니다..!

흥미가 있다면 들으셔도 좋지만, 여기부터는 나중으로 미루셔도 될 것 같네요..!

 

CS 이론에 대한 부분은, 저는 그냥 대학교 다니면서 교수님들이 해주시는 강의 열심히 들었습니다. 외에는 무조건 책으로 공부했고요.

조금 조심스러운 의견일 수 있지만..

솔직히 누구나 올릴 수 있는 교육 플랫폼 온라인 강의는 깊이도 얕고 내용도 딱히 없는데 가격만 비싸지(핵심 요약 느낌도 있어서 절대 나쁘단건 아닙니다!),

전문가들이 만들어둔 대학 강의나 책이 훨씬 자세하고 체계적이며 내용도 깊습니다.

심지어 이런 것들이 오히려 저렴하거나 무료도 많고, 책은 굳이 살 필요도 없이 도서관에도 많습니다.

CS 이론은 개발자보다 그냥 학문 연구하신 전문가들이 훨씬 잘 압니다. (저도 잘 몰라요)

요즘 무료로 풀리는 대학 강의도 많더라고요.

알고리즘은 그냥 문제 많이 풀면서 양치기가 답인 것 같습니다.

객체지향/방법론에 대한건 책 많이 읽어보면서, 직접 코드 많이 만들고 적용하다보면 슬슬 와닿는 시점이 오더라고요.

개인적으로 입문 시절 읽었던 책에서 몇 권 추천하자면, 오브젝트/토비의스프링1권이 너무 좋았습니다.

요즘 신입 취업에 포트폴리오는 당연히 필요할테니 이것도 간단히 언급드리면,

기본기에 충실한 내용으로 정말 제대로 된 것 하나만 만들어도 충분한 것 같습니다.

굳이 비슷하고 뻔한 내용들 여러 개 만들 필요도 없는 것 같습니다.

 

2.

어떤 기술을 많이 쓴다기보단, 그냥 “데이터베이스”와 “데이터 모델링”을 잘 알면 뭘 써든 상관 없습니다!

데이터베이스는 결국 지긋하게 공부하는 과정이 필요한 것이고요.

그리고 데이터베이스”만” 공부한다는건 없습니다.

데이터베이스를 이해하려면, 자료구조/운영체제 등 다른 이론도 어차피 다 같이 공부할 수 밖에 없습니다.

데이터 모델링은 스스로 직접 얼마나 깊게 고민하면서 설계를 경험해보는 과정이 있어야 합니다.

그런데 취준생 입장에서는 복잡한 비즈니스를 다룰 일이 잘 없다보니, 모델링 경험은 상대적으로 부족할 수 밖에 없긴 하네요.

데이터베이스 학습하다보면 모델링에 대한 내용(정규화, 1~5NF, BCNF 이런 용어들)도 같이 학습하게 될텐데요,

이런 개념들 잘 학습해보시고,

자신의 포트폴리오에 직접 설계하며 고민도 해보시고,

정말 복잡한 모델링은 나중에 실무에서 경험하시면 충분합니다.

결국 이러한 기반 개념만 알면, 클라이언트 기술에 대한 선택은 spring data jdbc를 쓰든, jpa를 쓰든, mybatis를 쓰든, native query를 쓰든 아무 상관 없습니다.

뭘 하든 금방 적응하고, 크게 어렵지 않습니다.

클라이언트 기술에 대해서는 특별히 뭘 추가로 공부할 필요도 없고, 당장 애플리케이션 개발에 jpa가 익숙하시면 그냥 jpa 사용하시면 됩니다!

 

 

생각나는대로 적어보았는데, 충분한 답이 되었을지는 모르겠습니다..

주변에서도, 여기 강의에서도 비슷한 질문을 정말 많이 받고 있습니다.

취업 시장이 어렵고, 취업에 대해서 불투명하다보니, 불안한 마음 충분히 이해가 됩니다. 저도 그랬었고요..!

심지어 요즘에는 변별력을 계속 만들어야 하다보니, 더욱 깊게 파고 들어가시더라고요.

이 과정에서 지치기도 많이 하는 것 같고요.

그런데 저는 하이레벨(아키텍처/클라우드/조금 더 큰 그림)보단 조금 더 로우레벨에서 밑바닥 개념들을 깊게 파고 들어가는걸 추천드립니다.

 

기본기에 대해서 계속 말하지만 다시 강조하고 싶은 점은, “코딩”만 할 수는 없다는 것입니다.

이상하게 개발자는 “코딩”만 하면 된다고 생각하는 경우가 많더라고요.

그래서 공부도 "코딩"만 하는 상황을 많이 봤습니다.

개발자가 만드는 시스템도 결국 사용자한테 팔거나 제공해서 돈을 벌어야하는거고,

안정적이고 좋은 시스템을 만드려면, 밑바닥 공부하고 차근차근 쌓아올리는 과정은 불가피한 것 같습니다.

 

내용만 너무 길어진게 아닌가 싶네요.. ㅎㅎ

꾸준히 공부하고 노력하다 보면 좋은 결과 있으리라 믿습니다!!

혹시 더 궁금한 점 있으시면 편히 문의 주세요!

blackhole124님의 프로필 이미지
blackhole124
질문자

댓글 진심으로 감사합니다

많은 도움이 됐습니다 !

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. blackhole124님.

강의에서 Query DSL 대신 Native Query를 사용하는 이유에 대해 궁금해 하셨군요. 이와 관련해 일반적인 실무 경험을 바탕으로 다음과 같이 설명드리겠습니다.

Native Query vs. Query DSL

  1. Native Query 사용 이유:

    • 직접적인 SQL 제어: Native Query는 개발자에게 데이터베이스에 대한 직접적인 접근과 높은 제어권을 제공합니다. SQL을 직접 작성함으로써 데이터베이스의 특화된 기능을 더 쉽게 활용할 수 있습니다.
    • 성능 최적화: 특정 상황에서 성능을 최적화할 수 있는 SQL 문법을 직접 사용할 수 있어, 복잡한 쿼리를 필요에 맞게 조정하고 최적화할 수 있습니다.
    • 의도 명확성: 어떤 SQL이 실행되는지 명확하게 이해할 수 있으며, 데이터베이스 모니터링 도구를 통해 쿼리 성능을 분석하기에도 유리합니다.
  2. Query DSL 사용의 장점:

    • 타입 안전성: Query DSL은 컴파일 시점에 오류를 잡아낼 수 있고, 데이터 조회 로직을 타입 안전하게 구현할 수 있습니다.
    • 동적 쿼리 작성: 코드 기반으로 동적 쿼리를 유연하게 작성할 수 있어 유연한 개발을 지원합니다.
    • 코드 가독성: 복잡한 쿼리 로직을 구조화된 코드로 표현할 수 있어 읽기 쉽고 유지보수가 용이합니다.

현업에서의 사용 경향

현업에서는 팀의 개발 철학과 상황에 따라 Native Query와 Query DSL 모두 사용됩니다. 단순하거나 빈번히 변경되지 않는 상황에서는 Native Query가 선호될 수 있으며, 복잡한 동적 쿼리가 필요하거나 타입 안전성이 요구되는 상황에서는 Query DSL을 사용하기도 합니다.

아래 유사한 질문에 대한 게시글 답변도 참고하시면 도움이 될 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.