트러블슈팅 29

2단계: "MySQL Error 1049: Unknown database"

[인용 및 참고 자료 출처]1. 구글 검색: 티스토리, "spring.jpa.hibernate.ddl-auto=create", ddl-auto 설정 시 주의 사항, (2024.12.15) [문제]이젠 프로그램을 실행할 때 오류가 안 나면 이상할 지경이다. 데이터베이스(database)를 제대로 생성한 줄 알았는데 아니었다. 오류 메시지를 볼 때마다 심장은 아직 철렁거리긴 하나, 이미 전날 새벽에 데이터베이스와 씨름한 전적이 있는지라 담담한 마음으로 데이터베이스를 확인했다. [원인]오류가 발생한 원인은 역시나, 데이터베이스가 이상하게 만들어진 데에 있었다. plans2라는 이름으로 데이터베이스를 만든 줄 알았는데 테이블로 생성되어야 할 'members2'가 데이터베이스로 있었다. [해결]문제는 금방 해결했..

1단계: "200 OK인데 왜 username이 null일까?"

[문제]400번 대이든 500번 대이든 오류 났다는 메시지가 뜨면 그나마 코드를 잘못 썼다고 짐작할 수 있는데, 200 OK 메시지와 다르게 입력한 값이 제대로 반영되지 않으면 더 골치 아팠다. null도 문제였으나, 수정됐다면서 일정 수정 날짜인 updatedAt의 값이 그대로인 점이 더 골치 아팠다. 도대체 원인이 뭔지 추측조차 못 한 채, '코드 또 전부 다 뜯어고쳐야겠구나.' 해탈한 심정으로 튜터님께 찾아갔다. [원인]package com.example.plan.plan.dto.request;import lombok.Getter;// 일정 수정 요청에 해당하는 request DTO@Getterpublic class UpdatePlanRequestDto { // (1) 속성 privat..

1단계: "not-null property references a null or transient value"

[문제]'일정 관리 앱 Develop' 과제는 JPA를 활용해야 했다. 필수 과제 1단계에서는 일정을 생성, 조회, 수정, 삭제할 수 있도록 CRUD를 구현해야 했는데, 생성(Create)에 해당하는 C를 구현한 다음 프로그램을 실행하자, 바로 500 Internal Server Error 메시지가 떴다. 우선 null이 들어가면 안 되는 곳에 null이 들어가서 생긴 문제라 짐작했다. [원인]package com.example.plan;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.data.j..

3단계: "406 Not Acceptable"

[문제]이러다가 정말 400번 대 오류를 전부 한 번 이상 만나겠다 싶었다. 데이터베이스(database) 구성이 완전히 바뀌고, 자료구조 대신 JdbcTemplate를 사용하면서 한 문제를 해결하면 다른 문제가 생겼다. [원인]package com.spring.weekthree.dto.member.response;import com.spring.weekthree.entity.Member;import lombok.Getter;// response DTO 클래스(class) @Getter // @Getter가 없으면 JSON 변환이 안 된다.public class MemberResponseDto { //(1) 속성 private long memberId; private String name..

3단계: "순환 참조 오류라니, 돌아가는 각도가 예술이군요."

[문제]열심히 코드를 고치고 나서 실행했더니만, 축하한다는 메시지인 양 APPLICATION FAILED TO START 오류 메시지가 떴다. 일명 순환 참조 오류였다. 화살표가 정말 한 치 오차도 없이 완벽한 각도로 꺾였다. [원인]// [1/1] Data Access Layer(Repository Layer)@Repositorypublic class JdbcTemplatePlanRepository implements PlanRepository { private final JdbcTemplate jdbcTemplate; private final PlanService planService; /* [오답] private final PlanService planService; [정..

3단계: "사용자 Id를 입력했는데 왜 자꾸 0이 나오니?"

[문제]몇몇 사용자가 이미 가입한 상황이라고 가정하고, 즉 데이터베이스에 몇몇 사용자 정보를 저장한 다음 3단계 도전 과제를 했다. 문제는 일정을 생성하는 데에는 성공했는데, memberId를 입력해도 계속 0이 나왔다. 아무래도 무언가를 빠뜨린 듯싶었다.  [원인]package com.spring.weekthree.dto.responsedto;import com.spring.weekthree.entity.Plan;import lombok.AllArgsConstructor;import lombok.Getter;import java.time.LocalDate;import java.time.LocalDateTime;// 클라이언트(client)에 응답하는 response DTO 클래스(class) @AllA..

2단계: "PATCH를 두 번 눌러야 수정이 돼요. 왜 이럴까요?"

[문제]Postman으로 일정을 부분 수정하는 PATCH를 실행하면 Send 버튼을 두 번 눌러야 수정되었다. 500번 대 오류 메시지가 뜨지는 않았으나, 이는 분명 무언가에 문제가 있다는 뜻이었다. 이 문제를 확실히 해결하고자 아침 9시에 팀에서 데일리 스크럼(Daily Scrum)을 마치는 대로 튜터님을 찾아갔다. [원인]이번에 발생한 문제는 PATCH 기능이 두 번 이루어진 게 아니라, 수정된 일정을 제대로 반환하지 않아서 생긴 문제였다. 스프링(Spring) 내에서 쓰는 객체와 데이터베이스는 별개인데, Send 버튼을 눌렀을 때 데이터베이스에서만 일정을 수정한 탓에 API 응답에서는 수정 전 일정이 출력된 것이었다. [해결](1) 데이터베이스와 한 번 더 소통하기ⓐ 해결 방법더보기package c..

1단계: "넌 띄어쓰기를 소중히 하지 않았어"

[문제]SQL 쿼리(query)문을 작성하고 실행하니 바로 500 Internal Server Error 메시지가 떴다. 이 정도면 저 오류 메시지를 보려고 리팩토링(refactoring)하는 게 아닌가 싶었다. [원인]package com.spring.weekthree.repository;import com.spring.weekthree.dto.responsedto.PlanResponseDto;import com.spring.weekthree.entity.Plan;import org.springframework.http.HttpStatus;import org.springframework.jdbc.core.*;import org.springframework.jdbc.core.namedparam.MapSq..

1단계: "아무래도 이름(name)이란 체에 구멍이 뻥 뚫렸나 보다."

[문제]분명히 Key 값으로 name을 넣었는데도 결과는 일정 목록을 조회할 때와 별반 다르지 않았다. 차라리 400이나 500번 대 오류 메시지가 떴다면 원인이 뭔지 금방 찾을 수 있으나, 200 OK 메시지가 뜨면 코드를 다시 읽어야 했다. 우선 수정한 부분을 다시 읽었다. [원인]package com.spring.weekthree.repository;import com.spring.weekthree.dto.PlanResponseDto;import com.spring.weekthree.entity.Plan;import org.springframework.http.HttpStatus;import org.springframework.jdbc.core.JdbcTemplate;import org.spring..

2단계: "왜 수정 날짜를 수정하려고 하니!"

[문제]벌써 500 Internal Server Error 메시지를 두 번이나 봤다. 이쯤 되니까 놀랍지도 않았다. 이번엔 또 뭘 잘못 했을까, 차분한 마음으로 설명을 읽었다. [원인]package com.spring.weekthree.repository;import com.spring.weekthree.dto.PlanResponseDto;import com.spring.weekthree.entity.Plan;import java.time.LocalDate;import java.util.List;import java.util.Optional;// [1/2] 인터페이스public interface PlanRepository { PlanResponseDto save(Plan plan); List ..