테이블은 생성되는데, 데이터베이스는 생성되지 않는 문제 해결
1. 문제 발생
- BaseEntity와 Schedule 엔티티를 작성하고 실행했지만, MySQL에 schedule 이름의 데이터베이스가 생성되지 않음
- 콘솔에는 아래와 같은 테이블 생성 SQL 로그는 출력됨:
create table schedule (
create_at datetime(6),
id bigint not null auto_increment,
modified_at datetime(6),
contents varchar(255) not null,
title varchar(255) not null,
username varchar(255) not null,
primary key (id)
)
➡️ 하지만 DBMS(MySQL)에는 해당 DB(schedule) 자체가 없어서 테이블도 확인 불가
2. 기대 결과
- MySQL Workbench 또는 CLI에서 schedule이라는 데이터베이스 안에 schedule 테이블이 생성되어 있어야 함

3. 원인 분석
- application.properties 설정 확인:
spring.application.name=schedule spring.datasource.url=jdbc:mysql://localhost:3306/board ❌ (문제 발생)
spring.application.name=schedule
spring.datasource.url=jdbc:mysql://localhost:3306/board
spring.datasource.username=root spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- 위 설정에서 DB 이름은 board → 즉, 테이블은 board DB 안에 만들어지고 있었음
- 하지만 개발자는 schedule DB 안에 테이블이 생기길 기대하고 있었음
해결 방법
- 아래처럼 DB 이름을 기대하는 schedule로 수정:
spring.datasource.url=jdbc:mysql://localhost:3306/schedule ✅
- 이 설정 이후 애플리케이션 실행 시, schedule DB에 자동으로 테이블 생성됨 (ddl-auto=create 덕분에)
게시물 생성 API 404 에러 문제 해결 과정
1. 문제 발생
- 게시물 생성 API를 작성하고 Postman으로 테스트했더니 404 Not Found 에러 발생.
2. 기대값
- 요청한 대로 게시물이 정상적으로 생성되어야 함.
3. 문제 분석 및 원인 추적
- 404 에러는 클라이언트 요청 URL에 해당하는 리소스를 서버에서 찾을 수 없다는 의미 → 서버 문제보다는 요청 URL 또는 매핑 설정 문제라고 판단.
(1) Postman 요청 URL 확인 → 문제 없음
(2) 스프링 부트 콘솔 로그 확인
- 정상이라면 콘솔에 다음과 같은 매핑 로그가 보여야 함:
-
복사편집Mapped "{[/schedules/save],methods=[POST]}"
- nginx
- 하지만 해당 로그가 없음 → 컨트롤러가 애플리케이션에 등록되지 않음
(3) 원인 확인
- 컨트롤러 파일이 @SpringBootApplication이 선언된 메인 클래스 패키지 외부에 존재.
- 스프링 부트는 기본적으로 메인 클래스가 위치한 패키지와 그 하위 패키지만 컴포넌트 스캔 대상으로 인식함.
→ 컨트롤러가 컴포넌트 스캔 대상이 아니었음
4. 해결 방법
- 컨트롤러 파일을 메인 클래스가 위치한 패키지 하위로 이동

올바른 값
5. 결과
- 파일 위치를 수정한 후, 콘솔에 매핑 로그가 출력되고
- Postman 테스트 결과도 정상적으로 게시물이 생성됨 ✅

static 관련 오류 정리: "비 static 메서드는 static 컨텍스트에서 참조할 수 없습니다"
1. 문제 발생
- UserService 클래스에서 UserRepository.save(user) 호출 시 다음 오류 발생:
"비 static 메서드 'save(S)'은(는) static 컨텍스트에서 참조할 수 없습니다"
2. 원인 분석
- 코드 상 실수:
User save = UserRepository.save(user); // ❌
- UserRepository는 클래스명 (대문자 시작)
→ 자바는 대문자로 시작하는 식별자를 클래스로 인식함
→ 이 코드는 클래스 이름으로 save() 메서드를 호출한 셈 - 그런데 save() 메서드는 static이 아님
→ 인스턴스를 통해 호출해야 함 (즉, userRepository.save()) - 수정한 코드:
User save = userRepository.save(user); // ✅
→ userRepository는 스프링이 주입한 인스턴스(빈)
→ 정상 작동
3. 개념 정리: static vs instance
항목staticinstance (비-static)
| 메모리 위치 | 메서드 영역 | 힙 영역 (객체 생성 시) |
| 소유 주체 | 클래스 전체 공유 | 객체 개별 소유 |
| 호출 방식 | 클래스명.메서드명() | 객체명.메서드명() |
| 사용 예 | Math.random(), static 유틸 메서드 | 대부분의 비즈니스 로직 |
헷갈릴 때 팁:
- 대문자로 시작하는 건 보통 클래스명!
- 클래스명.메서드명()으로 접근할 수 있는 메서드는 static만!
- 비-static 메서드를 부르려면 객체가 먼저 있어야 한다!