ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PostMan 400에러 badRequest error 발생과 해결과정 (Mysql 예약어 오류)
    spring 2024. 1. 30. 14:43
    반응형

     

    상황

     

    SpringBoot CRUD 작업을 테스트 하는 과정에서 PostMapping 요청에 대한 PostMan 호출 결과가 400error badRequest가 나왔다.

     

    400에러는 해당 요청이 잘못되었을 때 보내는 상태 코드이다.

    주로 요청의 Body에 보내는 내용이 잘못되었을 때 사용되는 코드이다.

    ex) 전화번호를 보내야 하는데 숫자가 아닌 문자열의 주소가 대신 Body에 담겼을 경우 등

     

    원인 분석

     

    우선 Header에 Content-Type이 application/json으로 되어있는지 확인해 볼 필요가 있었고 문제가 없었다.

     

    intelij의 error로그를 보면 

    2024-01-30 12:02:20.248  WARN 1812 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `cohttp://m.mapleApiTest.projectOne.dto.character.request.CharacterCreateRequest` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator); nested exception is cohttp://m.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `cohttp://m.mapleApiTest.projectOne.dto.character.request.CharacterCreateRequest` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)<EOL> at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 2, column: 5]]

     

    http 요청의 본문(Json)을 해당 클래스의 인스턴스로 반환하는 데에 문제가 있다는 의미이다.

    이를 위해 dto 클래스의 기본생성자와 getter를 추가해 주었으나 변함이 없었다.

     
    java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'character (name) values ('abc')' at line 1
     
    추가로 위와 같은 에러 메시지가 있었다.
    'character'를 class로 사용하고 있었는데 여기서 문제가 발생한 것이었다.
    Mysql에서 character는 예약어로서 사용되기 때문에 이를 Table 이름으로서 사용할 경우 오류가 생기게 된다.
    따라서 기존에 Entity class를 비롯한 각종 메서드의 이름을 characters로 우선 변경해주었더니 PostMan 에서 200ok가 반환되었다.
     
    아래는 Mysql 예약어 표이다. 표를 참고하여 변수 및 Table명 선정에 신중을 기해야겠다.
     
     
    ADD ALL ALTER
    ANALYZE AND AS
    ASC ASENSITIVE BEFORE
    BETWEEN BIGINT BINARY
    BLOB BOTH BY
    CALL CASCADE CASE
    CHANGE CHAR CHARACTER
    CHECK COLLATE COLUMN
    CONDITION CONSTRAINT CONTINUE
    CONVERT CREATE CROSS
    CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP
    CURRENT_USER CURSOR DATABASE
    DATABASES DAY_HOUR DAY_MICROSECOND
    DAY_MINUTE DAY_SECOND DEC
    DECIMAL DECLARE DEFAULT
    DELAYED DELETE DESC
    DESCRIBE DETERMINISTIC DISTINCT
    DISTINCTROW DIV DOUBLE
    DROP DUAL EACH
    ELSE ELSEIF ENCLOSED
    ESCAPED EXISTS EXIT
    EXPLAIN FALSE FETCH
    FLOAT FLOAT4 FLOAT8
    FOR FORCE FOREIGN
    FROM FULLTEXT GRANT
    GROUP HAVING HIGH_PRIORITY
    HOUR_MICROSECOND HOUR_MINUTE HOUR_SECOND
    IF IGNORE IN
    INDEX INFILE INNER
    INOUT INSENSITIVE INSERT
    INT INT1 INT2
    INT3 INT4 INT8
    INTEGER INTERVAL INTO
    IS ITERATE JOIN
    KEY KEYS KILL
    LEADING LEAVE LEFT
    LIKE LIMIT LINES
    LOAD LOCALTIME LOCALTIMESTAMP
    LOCK LONG LONGBLOB
    LONGTEXT LOOP LOW_PRIORITY
    MATCH MEDIUMBLOB MEDIUMINT
    MEDIUMTEXT MIDDLEINT MINUTE_MICROSECOND
    MINUTE_SECOND MOD MODIFIES
    NATURAL NOT NO_WRITE_TO_BINLOG
    NULL NUMERIC ON
    OPTIMIZE OPTION OPTIONALLY
    OR ORDER OUT
    OUTER OUTFILE PRECISION
    PRIMARY PROCEDURE PURGE
    READ READS REAL
    REFERENCES REGEXP RELEASE
    RENAME REPEAT REPLACE
    REQUIRE RESTRICT RETURN
    REVOKE RIGHT RLIKE
    SCHEMA SCHEMAS SECOND_MICROSECOND
    SELECT SENSITIVE SEPARATOR
    SET SHOW SMALLINT
    SONAME SPATIAL SPECIFIC
    SQL SQLEXCEPTION SQLSTATE
    SQLWARNING SQL_BIG_RESULT SQL_CALC_FOUND_ROWS
    SQL_SMALL_RESULT SSL STARTING
    STRAIGHT_JOIN TABLE TERMINATED
    THEN TINYBLOB TINYINT
    TINYTEXT TO TRAILING
    TRIGGER TRUE UNDO
    UNION UNIQUE UNLOCK
    UNSIGNED UPDATE USAGE
    USE USING UTC_DATE
    UTC_TIME UTC_TIMESTAMP VALUES
    VARBINARY VARCHAR VARCHARACTER
    VARYING WHEN WHERE
    WHILE WITH WRITE
    XOR YEAR_MONTH ZEROFILL
     

     

     

    반응형

    댓글

Designed by Tistory.