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

지영님의 프로필 이미지

작성한 질문수

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

13강 DB연결 관련 질문드립니다.

24.06.26 15:36 작성

·

137

1

안녕하세요. 우선 좋은 강의 만들어 주셔서 감사합니다.

13강을 수강하던 중 오류가 발생하여 질문드립니다.

 

검색해보니 테이블 명이 user로 생성을 하면 안되는 것 같아 user_table 이라는 명칭으로 테이블을 생성했습니다.

CLI로 확인해본 결과 테이블 자체는 정상적으로 생성이 되었습니다.

 

3.png

4.png

 

그런데 컨트롤러와 yml 파일 설정 후 화면에서 데이터를 저장하려고 하니 오류가 발생합니다.

 

5.png

 

 

spring:
  database:
    url: "jdbc:mysql://localhost/library"
    username: "root"
    password: ""
    drive-class-name: com.mysql.cj.jdbc.Driver
package com.group.libraryapp.controller.User;

import com.group.libraryapp.domain.user.User;
import com.group.libraryapp.dto.User.request.UserCreateRequest;
import com.group.libraryapp.dto.User.response.UserResponse;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

@RestController
public class UserController {

    private final JdbcTemplate jdbcTemplate;

    public UserController(JdbcTemplate jdbcTemplate){
        this.jdbcTemplate = jdbcTemplate;
    }

    private final List<User> users = new ArrayList<>();

    @PostMapping("/user")
    public void saveUser(@RequestBody UserCreateRequest request){
        String sql = "INSERT INTO user_table (name, age) VALUES (?,?)";
        jdbcTemplate.update(sql, request.getName(), request.getAge());
    }

    @GetMapping("/user")
    public List<UserResponse> getUsers() {
        String sql = "SELECT * FROM user_table";
        //람다로 변경 알트+엔터
        return jdbcTemplate.query(sql, (rs, rowNum) -> {
            long id = rs.getLong("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            return new UserResponse(id, name, age);
        });
    }

}

 


INSERT INTO user_table (name, age) VALUES (?,?) [42104-214]] with root cause

org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USER_TABLE" not found (this database is empty); SQL statement:
INSERT INTO user_table (name, age) VALUES (?,?) [42104-214]
	at org.h2.message.DbException.getJdbcSQLException(DbException.java:502) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.message.DbException.get(DbException.java:223) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.message.DbException.get(DbException.java:199) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.command.Parser.getTableOrViewNotFoundDbException(Parser.java:8385) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.command.Parser.getTableOrViewNotFoundDbException(Parser.java:8369) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.command.Parser.readTableOrView(Parser.java:8358) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.command.Parser.readTableOrView(Parser.java:8328) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.command.Parser.parseInsert(Parser.java:1632) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.command.Parser.parsePrepared(Parser.java:814) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.command.Parser.parse(Parser.java:689) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.command.Parser.parse(Parser.java:661) ~[h2-2.1.214.jar:2.1.214]
	at org.h2.command.Parser.prepareCommand(Parser.java:569) ~[h2-2.1.214.jar:2.1.214]

 

2.png

위와 같이 데이터베이스가 비었다고 하고 테이블을 찾지 못하는데 제가 어느 부분을 확인해야 하는지 궁금해 질문드립니다.

 

답변 2

0

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

2024. 06. 26. 21:18

안녕하세요 지영님!! 질문 주셔서 감사합니다! 🙂

 

제 추측으로는 테이블 이름에 대한 대소문자 차이가 유력한 것 같습니다.

  • 현재 library 라는 database에 user_table이 잘 생성된 것을 직접 확인해주셨고요!

  • library DB로 설정도 잘 해주셨고요

  • 그럼 이론적으로 스프링이 해당 DB에 잘 붙었는데, 정작 insert SQL을 실행하는 과정에서 USER_TABLE 이라는 테이블을 찾지 못했다는 것이니..

 

user_tableUSER_TABLE 대소문자 차이가 아닐까 싶습니다.

SQL에서 사용되는 테이블을 소문자로 바꿔보시면 좋을 것 같아요!

 

꼭 해결되셨으면 좋겠습니다.

감사합니다! 🙏

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

2024. 06. 27. 01:03

안녕하세요.

 

SQL에 적어둔 테이블 명도 모두 소문자 user_table로 적어뒀는데 콘솔에서는 대문자 USER_TABLE로 표출이 되고 있는 것도 의문입니다.

 

혹시 이런 경우에는 어느 부분의 확인이 더 필요할까요?

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

2024. 06. 27. 06:31

안녕하세요! 어 그렇네요! 코드에는 소문자로 잘 돠어 있군요!

 

다시 보니 이상한 점이 있는데요!

  • 테이블을 설정해둔 데이터베이스는 mysql인데

  • 현재 테이블이 없다고 에러를 내는 데이터베이스는 h2입니다!

 

즉 스프링이 mysql에 연결을 하지 못하고 있는 것 같은데요

  • application.yml 파일의 이름과 위치

확인이 한 번 더 필요할 것 같아요!

 

또한 현재 실행되는 profile도 확인해보면 좋을 것 같습니다 profile은 38강을 미리 보시면 될 것 같아요!

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

2024. 06. 27. 13:43

안녕하세요.

말씀주신대로 38강을 참고하여 application.yml 파일을 수정해보았습니다.

 

spring:
  database:
    url: "jdbc:h2:mem:library; MODE=MYSQL;"
    username: "root"
    password:
    drive-class-name: org.h2.Driver

jpa:
  hibernate:
    ddl-auto: create
  properties:
    hibernate:
      show-sql: true
      format: true
      dialect: org.hibernate.dialect.H2Dialect

  h2:
    console:
      enabled: true
      path: /h2-console

 

그런데 아직도 동일한 오류가 발생하고 있습니다.

혹시 몰라 dev 설정도 함께 넣어서 해보았는데도 결과는 동일하더라구요.

 

image

현재 application.yml 파일의 위치는 resources 폴더 안에 있습니다만

강의에서 보였던 것 같은 스프링 이파리 아이콘이 아닌 붉은 Y 아이콘입니다.

혹시 뭔가 추가로 설정이 더 필요한지 궁금하여 질문드립니다.

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

2024. 06. 27. 16:14

안녕하세요!

application.yml 파일 이름과 위치는 잘 설정하신 것 같아요!

38강을 보고 고쳐주신 부분은 오히려 mysql 대신 h2를 사용하게끔 바꾸신 것 같습니다! 위에서 설명드린 것처럼 현재 문제는 h2를 사용하고 있는게 문제고 우리는 왜 스프링 부트가 h2를 쓰는지 파악하고 있어요!

 

스프링 이파리 아이콘은 IntelliJ 유료 버전일 때 바뀌는 거라서 크게 걱정하지 않으셔도 될 것 같습니다.

 

profile을 말씀드린 이유는 예를 들어

  • mysql 설정이 default profile로 잘 되어 있는데

  • 스프링 부트는 local profile로 되어 있다면

  • h2가 사용될 수 있기 때문에

     

현재 실행되는 스프링 부트의 profile을 확인해 보면 좋을 것 같가라는 의미로 말씀 드려보았습니다

 

위의 profile도 확인해 보셨는데 계속 h2로 동작한다면

  • github에 프로젝트를 올린 후 링크를 주시거나

  • 프로젝트를 압축해서 메일 choi-0202@naver.com로 보내주시면

저도 직접 확인해보도록 하겠습니다. 감사합니다! 🙏

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

2024. 06. 27. 18:19

안녕하세요.

 

말씀 주신 profile은 제가 설정을 뭔가 잘못한 건지 아예 접속이 되지 않습니다.

image

프로젝트 파일은 메일로는 전송할 수 없는 확장자가 포함되어 있다고 하여

임시로 구글드라이브에 파일 업로드 해 두었습니다.

 

아래 링크 확인 부탁드립니다.

https://drive.google.com/drive/folders/19SlD2Z9dBMBoKE-0ihVALJc-Vlt6OdQ5?usp=sharing

 

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

2024. 06. 28. 09:26

안녕하세요 지영님.

 

보내주신 구글 드라이브에서 다운로드 받아 확인해보았습니다.

결론부터 말씀드리면,

spring.database 가 아닌 spring.datasource 로 설정해주셔야 합니다!

base -> source입니다!

 

아래 설정을 application.yml 에 그대로 이용하시면 문제 없이 H2 대신 MySQL을 사용하실 수 있을거에요! 🙂

또한, MySQL은 user 라는 이름을 특정한 키워드로 사용하고 있지 않아서 user_table 대신 user 라는 이름으로 테이블을 사용하실 수 있습니다

 

spring:
  datasource:
    url: "jdbc:mysql://localhost/library"
    username: "root"
    password: ""
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: none
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        dialect: org.hibernate.dialect.MySQL8Dialect

 

/h2-console에 접근이 되지 않았던 이유도 datasource 대신 database 라는 이름을 사용했기 때문입니다! datasource 로 쓰시면 MySQL 대신 H2를 쓰시더라도 문제없이 h2 console에 접근하실 수 있을거에요.

답변이 도움이 되었으면 좋겠습니다. 감사합니다! 🙏

0

인프런 AI 인턴님의 프로필 이미지

2024. 06. 26. 15:41

안녕하세요, 인프런 AI 인턴입니다.

지영님께서 제시하신 문제는 Spring Boot 애플리케이션에서 MySQL 데이터베이스 대신 H2 데이터베이스를 사용하고 있기 때문에 발생합니다. 오류 로그에서 org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USER_TABLE" not found 라는 메시지는 H2 데이터베이스에서 user_table을 찾을 수 없다는 것을 나타냅니다. 이는 application.yml 파일의 설정이 H2 데이터베이스를 대상으로 하고 있거나, MySQL로의 연결 설정이 제대로 되지 않았을 가능성을 시사합니다.

제공된 코드를 보면, application.yml 파일 설정에 몇 가지 오타와 부정확한 구성이 포함되어 있습니다. 정확한 설정은 다음과 같아야 합니다:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306(library는 데이터베이스 이름, 3306은 MySQL의 기본 포트)
    username: root
    password: 비밀번호
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: update # 혹은 none
    show-sql: true

이와 유사한 문제를 겪고 있는 다른 학습자의 경우를 참조해 보세요. 밑에 제공한 링크는 데이터베이스 연결 및 설정에 관한 문제를 해결하는 데 도움이 될 수 있습니다.

  • 13강 과정에 질문있습니다.

    • 이 질문은 H2 데이터베이스와 MySQL을 혼용하여 사용하다 발생한 문제를 다루고 있습니다. application.yml 파일에서 MySQL 설정을 확인하고 H2 대신 MySQL을 사용하도록 설정 변경을 제안합니다.
  • [13강] application.yml 파일 설정에서 문제가 있습니다.

    • 이 경우는 application.yml 파일에 오타가 문제였으며, 올바른 데이터베이스 드라이버 클래스를 지정하는 방법에 초점을 맞췄습니다.

올바른 데이터베이스 설정을 사용하고 있음에도 불구하고 오류가 지속된다면, 아래 주의사항을 확인해 주세요.
- 데이터베이스와 연결된 포트 번호가 올바른지 확인하세요.
- 사용 중인 MySQL 서버가 실행 중이고 접근 가능한지 확인하세요.
- application.yml 설정이 애플리케이션에서 올바르게 참조되고 있는지 확인하세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

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

2024. 06. 26. 15:56

spring:
  database:
    url: jdbc:mysql://localhost:3306
    username: root
    password: 
    drive-class-name: com.mysql.cj.jdbc.Driver

jpa:
  hibernate:
    ddl-auto: update # 혹은 none
  show-sql: true

말씀주신대로 위와 같이 application.yml 파일을 수정했으나 동일한 오류가 발생합니다.

 

위와 같이 작성하는게 맞을까요?

 

image

포트는 확인결과 3306 포트로 되어있습니다.

 

image

MySql 서버도 실행중임을 확인하였습니다.

지영님의 프로필 이미지

작성한 질문수

질문하기