본문 바로가기
카테고리 없음

[스프링 심화] 트러블 슈팅

by codechu 2025. 5. 21.

테이블은 생성되는데, 데이터베이스는 생성되지 않는 문제 해결

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 메서드를 부르려면 객체가 먼저 있어야 한다!