• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

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

24.06.26 15:36 작성 조회수 63

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

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

 

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

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

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

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

 

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

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

 

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

감사합니다! 🙏

지영님의 프로필

지영

질문자

2024.06.27

안녕하세요.

 

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

 

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

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

 

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

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

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

 

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

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

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

 

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

지영님의 프로필

지영

질문자

2024.06.27

안녕하세요.

말씀주신대로 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 아이콘입니다.

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

안녕하세요!

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

안녕하세요.

 

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

image

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

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

 

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

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

 

안녕하세요 지영님.

 

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

결론부터 말씀드리면,

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 인턴님의 프로필

인프런 AI 인턴

2024.06.26

안녕하세요, 인프런 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

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 서버도 실행중임을 확인하였습니다.

채널톡 아이콘