ercnam
3k
2020-01-06 17:02:25
7
1036

Springboot + JPA + Querydsl 해보고 있습니다


예전에 스프링부트 못해먹겠다고 하소연 했었죠..

그러나 결국 극복(?) 했습니다. 아니, 하는중?


사실 기존 스프링레거시 + STS + MyBatis 등 국비스러운(.....) 스킬셋에서

헛바람 같지만 제목같은 스킬셋으로 바꾸면 뭔가 원X드 같은 간지나는 구직사이트에 어울리는 인재가 되지 않을까 하는 기대감에 (...) 도전중인데요.

IDE도 있어보일려고 인텔리제이 커뮤니티버전(...) 으로 바꿨고

(사실 얼티밋 지를려고 했는데 연말이라 지출이 많잖아 라며 변명을)

프론트도 JSP에서 mustache? 로 바꿨는데

사실... 참고할려고 산 책에서 저런 조합으로 하길래 따라하는 중입니다.


뭐 아무튼...아.

CSS도 부트스트랩 붙여서 그럴싸하게 하고 있군요. 

사실 애초에 하고 있었어야 했는데 너무 그동안 야매로 코딩하느라....후...


다시 아무튼...

DB는 여전히 MSSQL이라 보통 MySQL 붙이는 예제에서 이 부분만 응용이 필요하긴 합니다만

뭐 어려운건 아니고...


이제 겨우 관리자 테이블 만들어서 신규등록, 로그인 테스트 하는중인데 하...

저번주에 등록까지 했었거든요.

근데 이게 패스워드는 평문으로 하면 안되니까 SHA512 라이브러리를 사용해서 일방향 암호화해서 넣는건데

DB 컬럼 데이터 타입은 varbinary(MAX) 이고..

기존 방식은 SHA512 라이브러리에서 암호화를 한 값을 String으로 받아서

MyBatis쿼리에서 CONVERT(varbinary(MAX), pw) 해서 넣었습니다.

로그인 할때도 마찬가지의 절차로.


그러나... 이젠 마이바티스 안쓰고JPA 를 쓰니까.

기존처럼 날쿼리를 날릴순 없고 (사실 @Query 가 있긴 하지만 쓰고싶지 않았음)

그래서 CONVERT를 못쓰잖아.. 어떡하지.

어? SHA512가 원래는 byte[] 를 반환하는 거였네?

음? JAVA byte[] 가 MSSQL varbinary 매칭이었네?

뭐여?? 그냥 byte[] 받아서 DB에 넣어주면 되는걸 왜 빙빙 돌아갔었지?


그래서 간지나게 Querydsl 도 도입해보고 id, pw 매칭 쿼리를 날려보는데..

펑펑

.......

내가 뭔가 문법적으로 잘못했나 싶어서 이리저리 바꿔봤는데 그래도 계속 null Exception 이 터집니다.

혹시나 해서 id만 쿼리해보니 테스트 코드 통과.

id랑 다른 컬럼을 AND 쿼리해보니 이것도 통과.

결국 pw 만 조회하면 터지는걸로 보아

아.... 뭔가 INSERT한 암호값이랑 다르구나...

그래서 조회 불일치로 결과없음(null)이 나오는 것이고....


사실... CONVERT 함수를 쓸때도

이게 MSSQL 에서 쓸때랑 MyBatis 에서 쓸때랑 결과값이 다르게 나오더군요

완죤 지멋대로임다...따흐흑


뭐 거두절미하고. Querydsl 에서 CONVERT()를 쓸수있는 방법.....이 있긴 할거같은데 찾기 귀찮아 호호...

그래서 결국 @Query 도입.

이것도 쉽지 않더군요. 먼저 어노테이션 선언하고 날쿼리를 갈기는건 알겠는데

쿼리 형태를 어떻게 날리는건지 감이 안왔습니다.

좀더 파보니 내가 알던 날쿼리를 날릴려면 nativeQuery = true 를 줘야하고

함수 매개변수를 쿼리에 집어넣을려면....뭐 이름기반이니 위치기반이니 방법이 여러개 있던데

전 ?n 으로 하는 위치기반이 맘에 들더군요. 어차피 매개변수 순서대로 써주면 되는 거니까요. 흠흠.


코드에 흩날리는 날쿼리를 보자니... 불안감이 생깁니다

어... 이거 인젝션 털리는거 아니야?

검색해봅니다. 스택오버플로우에도 저와같은 걱정을 하는 사람들이 많습니다.


Q. @Query 이거... 코드에다 쿼리를 주르륵 쓰는건데 인젝션 털리는거 아님?
A. 네가 생각하는 것과는 다르게 <못알아들음>해서 <뭔소린지모르겠음> 하기 때문에.. 안전해.


하긴 JPA가 뭐80년대에 나온것도 아닌데 (사실 언제나온건지 모름ㅋ)

인젝션 대비책 정도는 기본탑재 되있겠지... 싶습니다.


결론은 Querydsl 로 로그인 구현 못하고 JPA nativeQuery를 날리는 것은 제잘못이 아니라는 겁니다

(네?)

뭐 사실 책에도 조회를 Querydsl 로 하고, 나머지 쿼리는 JPA 로 한다 (=병행한다) 라고 적혀있는것 같으니

굳이 무조건 Querydsl 만 써야한다는 법은 없는거 같아요.

문제는 이제 꼴랑 이거 구현해놓으면 진도를 언제빼냐는것...

2월 되자마자 오픈이라던데... 하.. 안되면 기존 레거시 코드나 살짝쿵 바꿔놓고 오픈부터 한 다음에

이거 다시 가지고 놀아봐야죠 뭐...


저기서 뭔가 추가해볼 스킬셋은 뭐가 있을까요?

사실 프론트3대장 (뷰, 리엑트, 엥귤러) 중 하나 손대봐야 할거같은데 묘하게 엄두가 안나네요. 흠.

제이쿼리 스릉흔드....

0
0
  • 댓글 7

  • 안녕
    1k
    2020-01-06 17:37:51 작성 2020-01-06 17:40:57 수정됨

    뭔가 글에서 설렘과 의욕이 보이네요 ㅎㅎ


    저도 뷰,리엑트, 엥귤러 세가지 가볍게 공부해봤는데

    (엥귤러는 js 버전,typescript 버전 프로젝트에서 실제로 사용해봤으니 조금 더 깊게 공부했다고 봐야겠네요;, 리엑트는 다른분 소스를 수정 해야하는 상황이 있어서 강제 공부)

    공통 잡는거 좋아하고 다른 고민 하는거 싫어 한다면 엥귤러 가 좋고(어느정도 강제되는 구조?가있어서 처음에 입문난이도가 있는반면  다른신경을 안써도되는 장점..저는 개인적으로 앵귤러의

    자체 디렉티브+ 커스텀 디렉티브 기능을 너무 좋아합니다..편한기능 많고, 잘 만들어놓으면 그렇게 든든 하고 편할수가 없음ㅠ)

    조립 좋아하시면 리엑트인거같아요..

    뷰는 사실 이제 공부시작해서 리엑트 의 구조에대한 고민 + 앵귤러 의 프론트 작업스타일 

    을 함께가진 가벼운 ui 프레임워크 느낌인데 셋중에 제일 쉬운것 같아요(위의 모든의견은 주관적인 제생각입니다)

    뷰부터 해보시면 어떨까요?  ㅎ 

    0
  • ercnam
    3k
    2020-01-06 17:50:06

    안녕

    답글 감사합니다.. 어휴 높게 쳐주시니 몸둘바를 모르겠네요

    사실 시간이 많은게 아닌데 이렇게 여유롭게 뭐 가지고 놀고 있어도 되나 싶지만...

    흠...사실 스프링시큐리티 붙여야 할거같은데

    ㅇ ㅏ... 시큐리티 잠깐 봤지만 이거 참....

    그냥 오늘 만든 로그인 조회에다 세션업로드만 붙여서 때울까 하는 생각이..........

    0
  • 밥도둑계장
    622
    2020-01-06 21:06:06

    으잉 queryDsl으로 로그인을., ㄷㄷㄷ어려운길을 가시는것같은 ㅠㅠ

    로그인은 그냥 기본 JPA Repository 정도만 써두될텐뎅

    상관관계가 없는 DB구조에서 상관관계를 맺으려구 queryDsl 사용하는건데!!!


    0
  • JohnMark
    473
    2020-01-06 21:09:25
    흠... 안될수가 없는데..ㅠㅠ 조금 코드를 알려주시면 알려드리고 싶은 심정이군요
    0
  • ercnam
    3k
    2020-01-07 08:47:50

    밥도둑계장

    아 ...역시 그랬군요...ㅋㅋ 아무때나 쓰는게 아니었군요

    ...근데 상관관계라는게 뭐..죠? join을 말하는건 아닐거 같은데..


    JohnMark

    크흡...말씀만이라도 감사합니다..

    0
  • 밥도둑계장
    622
    2020-01-07 09:46:40 작성 2020-01-07 09:56:59 수정됨

    ercnam 

    간단하게 말하면 조인이 맞아요 ㅎㅎ

    jpa는 상관관계가 맺어진 테이블에 관해서 단방향 또는 양방향으로 데이터 처리를 하게되어있는데

    예를들어 

    oneToMany , ManyToOne 설정이 안된  테이블들을 조인걸어서 데이터를 뽑고싶으면

    native query를 썡으로 날려야하는데 

    native query라는게 문자열로 처리되다보니 휴먼의 실수가 발생하는 경우가있어서...

    퇴근하다 돌아오고...

    배포하니 오류터지고..

    해서 compile 단계에서 오류를 잡아주는 queryDsl을 사용하게 된거같습니다.



    0
  • action
    2k
    2020-01-07 15:30:39

    본문에서 말씀하신 JPA 삽질 저도 다 겪어본거 같네요.

    개인차가 있긴 하겠지만, 그에 비하면 vue는 할만했던거 같습니다.

    그거에 비하면 spring boot가 spring 하다 boot 도입하기에 생각보다 문제 없었다고 생각하긴 합니다.


    JPA 특히 연관관계들 복잡해지면 너무 힘들어져서, 잘모르는 상태로 혼자 공부하면서 도입하기에는

    시간을 너무너무 많이 잡아먹는다고 느꼇습니다.

    단순한 게시판 한방향정도 연관관계들은 상관없는데 서로 읽히고 하면..

    확실히 장점들도 많긴 하지만 잘 모르고 바로 도입해서 쓰기에는 리스크가 컸습니다.

    숙달된 상태에서는 확실히 mybatis보다 쿼리짤일은 덜하니까 속도는 더 나오겠다 싶기는 합니다.

    DB도 JAVA에서 좀더 견고하게 제어할 수도 있기도 하구요.

    Mybatis도 사실 정규식이나 자동화 프로그램 돌리면 속도가 훨씬 빠르다고 생각해서

    아직 JPA를 맘편히 도입하기에는 제가아직 부족한거 같네요.

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.