본문 바로가기
자기개발/새싹톤_POA

java를 제대로 배우지 않으면 이런게 고생이구나

by 금화맘 2023. 6. 8.

java를 배우지 못하고 혹은 springboot나 jpa에 대해 제대로 배우지 못하고 그냥 개발을 하려고 하니 이것저것 우당탕탕이고 시간도 많이 잡아 먹는다는게 이런거구나를 실시간으로 깨닫는 중입니다.

entity의 칼럼을 "게시글_id"로 잡았는데 이렇게 잡으면 jpa가 못알아 먹는다. 이걸 몰라서 entity 칼럼을 스네이크로 잡았다..ㅎ node.js로 할땐 수업을 들었어서 카멜케이스를 지향하고 스네이크를 지양했는데... 게시글Id로 하면 jpa도 잘 알아먹었을 것을...

게시글을 그저 최신순으로 가져오고 싶었는데 repository에도, 서비스단에서도 jpa문법대로 만들었는데 안먹어서 너무 당황스럽고.. 왜 계속 나는 괄호에 creator_id로 썻는데 자꾸 creator만 찾지? 라거나 아니 왜 creatorId로 했는데 creator를 찾지?가 되는 것이었다. 계속 에러메시지로는 creator가 없는데 너가 찾는데 creator_id냐 라고 물어보기만 하고... 나보고 어쩌라는 건지..

서비스에서 결국은 아래 같이 만들고

List<ArtworkDto> findAllDesc(){
List<ArtworkEntity> lastArtworks = artworkRepository.findAllByOrderByArtworkIdDesc();
return artworkMapper.toDtoList(lastArtworks);

리포지토리에서는 이렇게 만들어서 실행시켰다... 감사..

되줘서 감사.. 압도적 감사

@Query(value = "SELECT a.* " +
"FROM artwork a " +
"ORDER BY a.artwork_id DESC",
nativeQuery = true)
List<ArtworkEntity> findAllByOrderByArtworkIdDesc();

나의 24시간이 들어가 있는 코드였다..

 

사실 시작은 jpa니까 서비스에서만 

List<ArtworkDto> findAllDesc(){
List<ArtworkEntity> lastArtworks = artworkRepository.findAllByOrderByArtworkIdDesc();
return artworkMapper.toDtoList(lastArtworks);

 

이렇게 만들면 되겠지 하고 호출했는데 다행히 그땐 ? 뭔가 제대로 됐는지? 데이터베이스가 비어있어서 그랬는진 몰라도 [] 얘가 리턴됐었다. 작동이 되는구나 했다. 

근데 이게 왠걸? 집에 돌아와서 다시 해보니 500서비스 에러가 떳다

그때 부터 왜? 라는 의문을 새기며 오만걸 다 뒤져봤다.

그래서 찾아보니

List<ArtworkEntity> lastArtworks = artworkRepository.findAll(Sort.by(Sort.Direction.DESC, "artwork_id"));

이런 sort를 이용해서 artwork_id를 심어서 하면 된다길래 서비스단에닥 이 코드를 심었다.

 

그러나 다시 만난 artwork가 없다. 너가 찾는건 artwork_id니라는 질문..

 

다시 찾았다. sort를 서비스 단에서 쓰면 리포지토리에서도 코드를 심어야 한다 했다.

List<ArtworkEntity> findAll(Sort sort);

그래서 얘를 심어봤다. 

 

again 아트워크 없음 그대가 찾는게 artwork_id인가?

 

암만 찾아도 jpa로 desc 를 사용하는건 함수이름을 jpa방식으로 하거나 sort를 사용해서 하거나 였는데... 도대체 왜...? 보통은 entity에 문제라던데 그렇지만 내 entity에는 아주 당연하게 artwork_id가 있었다.

그래서 혹시나 싶어서 컬럼 어노테이션에 name을 심어봤다.

   @Id
    @Column(nullable = false, name = "artworkId")
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Integer artwork_id;

 

아주 놀랍도록 효과가 없었다.

알고보니     private Integer artworkId;로 하고  @Column(nullable = false, name = "artwork_id")로 하는게 일반적이고 자바도 동작하는 방식이라고 하더라. 근데 이미 artwork_id로 만들어 놓은게 많아서 

그냥  query를 사용하기로 했다. 쿼리는 이미 작동한다는 걸 알고 있었기 때문에(동료가 쓴게 작동한거 봤다.) 그래서 쿼리를 작성하니 동작함. 할레루야.

 

아.. 쿼리도 마지막에 있는 nativeQuery= true를 꼭 붙여줘야 작동하더라..

 

이렇게 쿼리로 줄줄이 작성하면서 느낀거지만 난 jpa를 사용하는거 너무 좋은데 이번 프로젝트에서는 쿼리문만 잔뜩 공부하네...? 다음은 정말 jpa를 사용해 보자...