DB 에러 Unknown column 'fromUserId' in 'field list'

Nam_JU·2022년 4월 14일
2

Spring

목록 보기
6/11
post-custom-banner

에러 배경

인스타그램의 구독(팔로우)기능을 제작하다가 콘솔에는 Insert가 잘 나왔지만 DB에는 올라가지 않았다.


에러 내용

Unknown column 'fromUserId' in 'field list'
SQL Error: 1054, SQLState: 42S22

Hibernate: INSERT INTO subscribe(fromUserId, toUserId, createDate) VALUES(?, ?, now())
2022-04-14 15:31:45.516  WARN 83289 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1054, SQLState: 42S22
2022-04-14 15:31:45.516 ERROR 83289 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : Unknown column 'fromUserId' in 'field list'
실행됐나===========?
2022-04-14 15:31:45.587  WARN 83289 --- [nio-8080-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [com.example.demostagram.handler.ex.CustomApiException: 이미 구독하였습니다 ]

유저 1: sa, 유저 2: new 를 생성하고 로그인후
구독을 포스트 맨에서 하였을때 이미 구독하였습니다 라는 문구가 뜸. 생성하지 않은 유저 페이지를 들어가면 에러가 나오거나 페이지가 나오면 안되는데 같은 내용이 응답되었다.


에러 해결 과정

검색을 했을때 DB에 칼럼이 없는 경우라고 하는데 나의 경우 스프링부트 내부에서 native Query 쿼리를 만들어두었다.

    @Modifying // INSERT, DELETE, UPDATE 를 네이티브 쿼리로 작성하려면 해당 어노테이션 필요!!
    @Query(value = "INSERT INTO subscribe(fromUserId, toUserId, createDate) VALUES(:fromUserId, :toUserId, now())", nativeQuery = true)
    void mSubscribe(long fromUserId, long toUserId);

    @Modifying
    @Query(value = "DELETE FROM subscribe WHERE fromUserId = :fromUserId AND toUserId = :toUserId", nativeQuery = true)
    void mUnSubscribe(long fromUserId, long toUserId);

에러 내용을 바탕으로 가설을 세워 보자.
  1. 쿼리는 실행이 되었음
  2. 하지만 DB에는 올라가지 않음
  3. 예외처리를 해두었던 controller Exception Handler가 실행됨
    //데이터리턴
    @ExceptionHandler(CustomValidationApiException.class)
    public ResponseEntity<?> validationApiException(CustomValidationApiException e) {
        System.out.println("실행됐나===========?");
        return new ResponseEntity<>(new CMRespDto<>(-1, e.getMessage(), e.getErrorMap()), HttpStatus.BAD_REQUEST);
    }

    @ExceptionHandler(CustomApiException.class)
    public ResponseEntity<?> apiException(CustomApiException e) {
        System.out.println("실행됐나===========?");
        return new ResponseEntity<>(new CMRespDto<>(-1, e.getMessage(), null), HttpStatus.BAD_REQUEST);
    }

The ERROR 1054 in MySQL occurs because MySQL can’t find the column or field you specified in your statement.

MYSQL 1054에러는 명령문에서 지정한 열이나 필드를 찾을 수 없어서 나타난 오류라고 한다.

This error can happen when you execute any valid MySQL statements like a SELECT, INSERT, UPDATE, or ALTER TABLE statement.

SQL문 오류를 확인해봐라 -> 쿼리에는 오류가 없었다.


찝찝한 해결

나는 h2 DB와 MYSQL DB 두가지를 사용했었는데 H2DB는 돌아갔고 MYSQL에서 해당 오류가 나왔다. MYSQL설정을 아무리 변경해봐도 오류가 잡히지 않아 새로운 스키마를 생성하여 연결하니 해결이 되었다.

그리고 오류났던 스키마를 다시 연결을 하니까 해결이 되었다 (??) DB가 꼬여서 이런 문제가 생긴것 같은데 명확한 해결이 아니라서 앞으로 해당 에러가 또 나타난다면 이 포스팅에 계속 기록 해야겠다.. 허헣



참고자료

https://sebhastian.com/mysql-error-1054-fix/
https://chobopark.tistory.com/92

profile
개발기록
post-custom-banner

0개의 댓글