일정 관리 앱 만들기 24

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..

Spring 본캠프 Day 065 - 일정 관리 앱 만들기 0단계부터 3단계까지 제출, 하루에 리드미(README)를 두 개나 작성하다니!

1. 필수 단계 과제 링크 2. 도전 단계 과제 링크전말은 이러했다. 필수 단계 과제에서 도전 단계 과제로 넘어가면 데이터베이스 구성 자체가 바뀌어서 깃허브(Github)에 브랜치(branch)를 하나 만든 뒤 각 과제를 저장했다. 나중에 필요할 때마다 원하는 결과물을 참고하고 싶어서. 그런 다음 팀원들과 함께 재즈 음악 흐르는 카페 분위기 속에서 각자 과제를 했는데, 그랬는데……. '어라? 잠깐만.' '둘의 구성이 다르면 ERD와 API 명세서도 달라야 맞지 않니?' 의문이 든 시간이 자정이 넘은 시간이었기 때문에 진짜 마른세수를 몇 번이나 했는지 모른다. 어제 새벽 2시 넘어서 리드미(README)를 쓰고, 아침에 잠깐 3단계 리팩토링(refactoring)을 진행하고, 오후 1시까지 속으로 통곡하면..

Spring 본캠프 Day 064 - 도전 단계 과제 첫 도전, 3단계 일정 관리 앱까지 일단 만들긴 했는데…….

역시 직접 짠 코드는 마음에 들지 않았다. 좋아하는 스파게티와 멀어지고 싶을 만큼. 퇴실하기 전 약 20분이 남았을 때, 튜터님이 한컴타자연습 치는 줄 아셨다고 웃음이 빵 터졌을 만큼 부서져라 키보드를 두들겨서 3단계 일정 관리 앱 만들기를 끝냈다. 도전 과제 3단계는 '데이터베이스(database) 구성을 바꾸면 얼마나 고생하는지' 몸소 겪으라는 의미로 내준 과제 같았다. 더도 말고 덜도 말고 표가 딱 하나 늘었을 뿐인데, 고칠 부분은 정말 자비 없이 늘었다.  10배? 아니. 20배.오늘은 점심과 저녁 시간 직전까지 튜터님과 3단계 과제를 붙잡느라 아침에 허리 근력 강화 운동을 하고 점심 먹기 전에만 10분 정도 움직였다. 다행히 오늘 메뉴가 부대찌개이기도 했고, '아무리 바빠도 한국인은 밥심이지!'..

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..

Spring 본캠프 Day 063 - 숙련 Spring 1주차 완강, 리팩토링이 아니라 이터널 리팩토링, 줄여서 이팩토링 중, 끝이 안 난다!

코드의 가독성이나 유지 보수성을 높이고자 내부 구조를 바꾸는 작업을 리팩토링(refactoring)이라고 하는데, 한 군데를 바꾸면 또 바꿀 데가 생기고 그곳을 다시 수정하면 또 고칠 곳이 눈에 띄었다. 다른 팀원분의 말대로 영원한 리팩토링, 일명 이터널 리팩토링(Eternal Refactoring)을 계속했다.TIL을 짧게 작성하고 if문과 else if문을 사용하며 중복된 부분을 다시 리팩토링해야 한다. 그냥 제출한다고 과제 점수가 깎이진 않겠으나, 내 마음에 들지 않는 코드가 다른 사람 마음에 들 리가 없었다. 위에 쓴 코드 또한 챗GPT의 도움을 많이 받은 만큼, 처음 쓰는 메서드(method)를 꼭 공부해야 지식을 제대로 나의 것으로 만들 수 있었다. 공식 문서를 읽으며 사용법을 익히고 하루를 ..

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 ..