리나 Dev토리

1차 회원가입까지의 트러블 슈팅 본문

SpringBoot 개인플젝(TodayMaker)

1차 회원가입까지의 트러블 슈팅

리나lina 2022. 11. 21. 06:09

트러블 슈팅이란?

문제를 정의하고, 원인을 추론하고, 조치 방안을 검토하고, 해결하는 과정이다.

 

처음에 thymeleaf로 index화면을 만들고 열어보면서

1-1. 에러코드

  • Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration

1-2. 원인

  • JPA 라이브러리를 받아놓고, DB 설정을 하지 않음

1-3. 해결

1) build.gradle에 MySQL 연결을 위한 runtimeOnly 'mysql:mysql-connector-java' 라이브러리를 추가
2) MySQL에서 사용자 추가

  • 별도의 사용자를 추가해주었다.
    create user '유저네임'@'%' identified by '비밀번호';
  • 데이터베이스 사용권한 부여
    grant all privileges on DB명.* to 유저네임@'%';
  • 권한 적용
    (변경 내용을 메모리에 반영)
    flush privileges;

3) application.properties 파일에 datasource 정보 입력

  • spring.datasource.url, username, password
  • gitignore에 .properties 추가
spring.datasource.url=jdbc:mysql://localhost:3306/DB명
spring.datasource.username=사용자명
spring.datasource.password=암호

 

2-1. 에러코드

  • TemplateProcessingException - th:field="*{loginId}"
    타임리프에서, 변수에 바인딩할 수 없음

2-2. 원인

  • 컨트롤러에서 @ModelAttribute 주석해놓고 실행해볼려고 시도해서

2-3. 해결

1) @ModelAttribute로 변수를 하나씩 받지 않고, 객체로 한번에 받을 수 있도록 함

2) 회원가입 폼을 위한 객체 생성

  • 회원가입 폼에서 입력에러로 폼 화면이 다시 표시될 때,
    입력했던 ID, 이메일 정보를 유지시켜주기 위해

 

3-1. 에러코드

  • Error creating bean with name 'userRepository' defined in com.todaymaker.repository.UserRepository
    ... IllegalArgumentException: Not a managed type: class com.todaymaker.domain.User

3-2. 원인

  • JPA에서 사용할 클래스에 @Entity를 추가하지 않아서
    • @Entity : 테이블과 매핑할 클래스

3-3. 해결

  • User 클래스에 @Entity 추가
  • PK인 ID 필드에 @Id, @GeneratedValue 추가

참고: https://conanglog.tistory.com/123

 

4-1. 에러코드

  • Field 'id' doesn't have a default value

4-2. 원인

  • MySQL에서 사용자 id 컬럼에 AI (자동증가) 설정이 안되어 있었음

4-3. 해결

  • MySQL Workbench에서
    Todo 테이블과의 식별관계인 FK설정으로 AI 설정이 불가하여, FK 해제 후, 사용자 테이블의 id에 AI 체크

 

5-1. 에러

  • 쿼리 문법 에러
    • MySQL Workbench에서 쿼리 테스트
      properties파일에서 spring.jpa.show-sql=true 로 설정
      -> 출력된 쿼리를 실행하니 Workbench에서도 Syntax 에러라고 뜸

5-2. 원인

  • 탈퇴여부 컬럼명 'out'이 MySQL에서 예약어로 사용불가한 단어

5-3. 해결

  • 컬럼명을 'isDeleted'로 변경

참고: http://www.mysqlkorea.com/sub.html?mcode=develop&scode=01&m_no=21584&cat1=9&cat2=294&cat3=0&lang=k

 

6-1. 현상

  • DB에 클래스 카멜스타일 필드명이 -> 언더바로 변경된 컬럼이 생성되어 저장되었다.

6-2. 원인

  • JPA에 기본 설정은 필드명이 카멜타입인 경우 언더바로 변경해줌

6-3. 해결

1) application.properties 파일에 언더바 방지 설정

  • spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
  • spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

참고: https://pinkcolor.tistory.com/34

 

2) 기존에 생성된 컬럼을 삭제 후 정상적으로 저장됨

 

What I learn

  • 기본의 중요성에 대해서 상기하게 되었다. 
    개념을 더 확실하게 이해할 수 되었다.
  • 인프런 실무 로드맵 강의도 보고, DB2 강의도 결제해서 봐야겠다.
Comments