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

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

wosyh18님의 프로필 이미지
wosyh18

작성한 질문수

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

13강. Spring에서 Database 사용하기

mysql 연결 관련 에러 질문있습니다

작성

·

64

0

안녕하세요 선생님. 실습 과정중 mysql과 연결이 잘 안 되는 것 같아 질문드립니다

 

  1. 처음에 있었던 에러였는데요 화면 접속 자체는 잘 되는데 이름과 나이를 저장하면

     

    2024-11-28 16:57:49.886 ERROR 13764 --- [nio-8080-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class com.group.libraryapp.dto.user.request.UserCreateRequest]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.group.libraryapp.dto.user.request.UserCreateRequest (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 2]] with root cause com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.group.libraryapp.dto.user.request.UserCreateRequest (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator) at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 2]

이런 오류가 떴습니다. 검색해보니 UserCreateRequest에 기본 생성자를 만들라고 해서 만든 후 실행하니 이 오류는 안뜨긴합니다.

image.png

인자 있는 생성자가 있었는데 왜 기본 생성자를 만들어야하는건가요? 지금 제 코드가 꼬여서 그런걸까요?

또한 에러 해결 방법으로

애노테이션 누락: Jackson 라이브러리에서 객체를 직렬화/역직렬화할 때 필요한 애노테이션이 누락되었을 수 있습니다. 예를 들어, 생성자에 @JsonCreator와 각 필드에 @JsonProperty를 추가해 보세요.

이런 방법을 추천하는데 이건 무엇인가요??

 

  1. 위 에러 고친 이후에는 SQL 문법 오류가 발생하는데요

  2.  

    image.png

    선생님과 똑같이 문법을 사용했는데 왜 오류가 생기는지 모르겠습니다..

  3.  

    image.png

    sql에 테이블 자체는 잘 생성되어있는 상태입니다

답변 1

0

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요! wosyh18님! 🙂 질문 올려주셔서 감사합니다. 하나씩 답변 드려 볼게요!

 

[1. no Creators, like default constructor 에러]

검색해서 해결하셨다니 정말 훌륭하시네요~ 👍

"인자 있는 생성자가 있었는데 왜 기본 생성자를 만들어야하는건가요?"

에 대해서도 답변 드리면, 네 맞습니다! 다만 모든 경우는 아니고 몇몇 경우에 기본 생성자가 있어야만 동작하는데요, 이런 몇몇 경우는 스프링 버전에 따라 달라질 수 있고, 객체를 어떻게 활용하는지 (GET API로 받는지, @RequestBody 를 사용하는 POST API인지, 필드가 1개인지, 여러 개인지 등등..) 에 따라 다르다 보니

저는 개인적으로 API에서 사용하는 DTO에는 기본 생성자를 모두 만들어주는 편입니다! 🙂

 

[2. Jackson - @JsonCreator와 각 필드에 @JsonProperty를 추가]

Jackson에 대해서도 말씀드려 볼게요! 🙂 제가 강의에서 설명드린 것처럼 결국 HTTP 라는 문자열이 서버 (스프링) 으로 들어오면 그 문자열을 우리가 만들어 놓은 객체로 변환하는 작업이 필요합니다!

예를 들어 {name: "태현", age: 3} 이라는 문자열은

public class UserCreateRequest {
  private final String name;
  private final int age;

  public UserCreateRequest(String name, int age) {
    this.name = name;
    this.age = age;
  }
}

클래스의 UserCreateRequest("태현", 3) 이라는 객체가 되어야 하죠

 

이 과정을 역직렬화 (문자열이 객체로 바뀌는 과정) 반대의 과정을 직렬화 (객체를 다시 문자열로 바꾸는 과정) 라고 말합니다.

그리고 Jackson이란 친구는 스프링 내부에서 이러한 직렬화/역직렬화 를 담당하는 라이브러리 입니다. 약간 비유해 보면.. 사람이라는 몸에서 소화를 담당하는 기관은 "위"라고 불러 하는 것처럼 Jackson이 그 역할을 담당하고 있는데요,

@JsonCreator @JsonProperty는 그런 Jackson과 관련된 어노테이션으로, @JsonCreator 를 하게 되면 Jackson이 어떤 함수를 역직렬화 과정에서 생성자 처럼 이용하게 되고, @JsonProperty를 사용하게 되면 특정 필드, 함수를 Jackson이 명시적으로 인식하게 됩니다.

다만 [no Creators, like default constructor 에러] 의 일반적인 해결 방법은 위에서 적용해주신 "기본 생성자 추가" 이기 때문에 지금은 아 이런게 있구나~ 하고 넘어가시거나 @JsonProperty 정도를 직접 써보시면서 이런 개념이구나 정도만 알고 계시면 충분할 것 같습니다.

 

[3. SQL 문법 에러]

마지막으로 SQL 문법 에러입니다! 결론부터 말씀드리면 INSERT INTO [*]user ... 라고 나와 있는데, user 라는 이름이 H2라는 데이터베이스의 미리 정의된 예약어라 에러가 발생하고 있습니다.

  • 실제로 그 아래 에러 코드 중 at.org.h2... 라는 "h2"가 보이죠!

즉, 현재 보내주신 화면으로 볼 때 작성해주신 스프링 코드는 MySQL과 실행되고 있지 않고 H2라는 DB와 함께 실행되고 있어요! 🥲

이런 경우는 application.yml 설정이 잘 되어 있는지 한 번 더 확인해 보시고, MySQL와 잘 붙을 수 있도록 해보시는 것이 좋을 것 같습니다. 혹시나 설정도 잘 된 것 같은데 계속 H2와 붙는다면, 저에게 application.yml 설정 그리고 서버가 실행될 때의 로그를 댓글로 보내주시면 저도 한 번 확인해보겠습니다.

 

꼭 해결되셨으면 좋겠습니다. 감사합니다! 🙇

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

서칭을 통해서 h2 의존성을 완전 제거하고 yaml파일에서 h2 관련 설정을 제거하였습니다

image.png

 

image.png

3306 포트가 잘 열려있는지 확인까지 했는데 접속이 잘 안 됩니다

 

image.png

 

***************************

APPLICATION FAILED TO START

***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class

Action:

Consider the following:

If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.

If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).

Process finished with exit code 1

이렇게 해도 mysql과 연동이 안됩니다 ㅠㅠ

최태현님의 프로필 이미지
최태현
지식공유자

아이고 그렇군요! 🥲

애플리케이션 전체 로그를 보면 제가 더 파악할 수 있을 것 같은데..

현재 제가 느끼기에는 yml 자체를 스프링이 인식하지 못하고 있는 듯 합니다.

application.yml 이라는 파일 자체의 오타일 수도 있고 특정한 profile이 설정되지 않아서 일 수도 있는데, 전자일 확률이 높아 보입니다..!

 

혹시나 계속해서 어려움을 겪으시면 현재 프로젝트 파일 전체를 압축해서 메일 choi-0202@naver.com 로 보내주시거나 (뒷 강의에서 다루는) git을 통해 github에 올려주시면 직접 확인해 보도록 하겠습니다.

감사합니다! 🙇

wosyh18님의 프로필 이미지
wosyh18

작성한 질문수

질문하기