24.06.26 15:36 작성
·
137
1
안녕하세요. 우선 좋은 강의 만들어 주셔서 감사합니다.
13강을 수강하던 중 오류가 발생하여 질문드립니다.
검색해보니 테이블 명이 user로 생성을 하면 안되는 것 같아 user_table 이라는 명칭으로 테이블을 생성했습니다.
CLI로 확인해본 결과 테이블 자체는 정상적으로 생성이 되었습니다.
그런데 컨트롤러와 yml 파일 설정 후 화면에서 데이터를 저장하려고 하니 오류가 발생합니다.
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
0
2024. 06. 26. 21:18
안녕하세요 지영님!! 질문 주셔서 감사합니다! 🙂
제 추측으로는 테이블 이름에 대한 대소문자 차이가 유력한 것 같습니다.
현재 library
라는 database에 user_table
이 잘 생성된 것을 직접 확인해주셨고요!
library
DB로 설정도 잘 해주셨고요
그럼 이론적으로 스프링이 해당 DB에 잘 붙었는데, 정작 insert SQL을 실행하는 과정에서 USER_TABLE
이라는 테이블을 찾지 못했다는 것이니..
user_table
과 USER_TABLE
대소문자 차이가 아닐까 싶습니다.
SQL에서 사용되는 테이블을 소문자로 바꿔보시면 좋을 것 같아요!
꼭 해결되셨으면 좋겠습니다.
감사합니다! 🙏
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 설정도 함께 넣어서 해보았는데도 결과는 동일하더라구요.
현재 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은 제가 설정을 뭔가 잘못한 건지 아예 접속이 되지 않습니다.
프로젝트 파일은 메일로는 전송할 수 없는 확장자가 포함되어 있다고 하여
임시로 구글드라이브에 파일 업로드 해 두었습니다.
아래 링크 확인 부탁드립니다.
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 인턴입니다.
지영님께서 제시하신 문제는 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
이와 유사한 문제를 겪고 있는 다른 학습자의 경우를 참조해 보세요. 밑에 제공한 링크는 데이터베이스 연결 및 설정에 관한 문제를 해결하는 데 도움이 될 수 있습니다.
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 파일을 수정했으나 동일한 오류가 발생합니다.
위와 같이 작성하는게 맞을까요?
포트는 확인결과 3306 포트로 되어있습니다.
MySql 서버도 실행중임을 확인하였습니다.
2024. 06. 27. 01:03
안녕하세요.
SQL에 적어둔 테이블 명도 모두 소문자
user_table
로 적어뒀는데 콘솔에서는 대문자USER_TABLE
로 표출이 되고 있는 것도 의문입니다.혹시 이런 경우에는 어느 부분의 확인이 더 필요할까요?