2024/12 48

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

1단계: "@NoArgsConstructor가 굴린 대형 눈덩이"

[문제]처음에는 전부 다 빨간 줄이 쳐져서 얼마나 심장이 벌렁벌렁 뛰었는지 모른다. 분명 강의를 들으며 코드를 따라 쳤는데, 왜 내가 쓴 코드에만 문제가 생기는지 영 감을 못 잡았다. 챗GPT에도 물었으나, 분명한 답을 얻지는 못했다. [원인]package com.spring.weekthree.entity;import lombok.AllArgsConstructor;import lombok.Getter;import java.time.LocalDate;import java.time.LocalDateTime;/*entity에 해당하는 Plan 클래스[오답] NoArgsConstructor[정답] AllArgsConstructor*/@NoArgsConstructor@Getterpublic class Plan {..

Spring 본캠프 Day 062 - 1단계 및 2단계 일정 관리 앱 만들기 중, toLocalDateTime(), toLocalDate(), getTimestamp()

늦게까지 실컷 자고 어기적거리며 일어났다. 천천히 자바(Java) 문제를 한 개 푼 다음에 경건한 마음으로 MySQL 데이터베이스(database) 연동 작업에 돌입했다. 주말이라 문제가 생기면 답을 구할 방법이 평일보다 마땅치 않았기 때문에 저번에 완강한 6주 차 강의를 다시 켜서 천천히 작업했다. 빨간 줄이 쭉쭉 생길 때마다 심장이 흔들다리를 건너듯 철렁거렸지만, 영어를 아주 어려워하지 않는단 장점을 떠올리며 챗GPT에도 물어보고 나름대로 문서를 찾아 읽으며 끝을 향해 달리는 중이다.챗GPT의 도움을 받아 문제를 해결했을 때 문득, 챗GPT도 좋은 도구이자 친구이며 잘 쓰는 능력 또한 역량 중 하나라는 튜터님의 말씀이 떠올랐다. 여기서 이런 생각이 함께 들었다. 문제를 해결했다고 넘어가면 챗GPT에 ..

2단계: "500 Internal Server Error라니! 일단 침착해!"

[문제]어쩐지 데이터베이스(database) 연동이 너무 순조롭다 싶었다. 두근거리는 마음으로 실행 버튼을 누르기 무섭게 무려 500 Internal Server Error 메시지가 떴다. 400번이 아니었기 때문에 코드 작성에 문제가 있다는 뜻이었다. 당황하긴 했지만, 보통 이럴 때는 꼭 문제가 무엇인지 설명도 같이 나오니까 읽어보기로 했다. [원인]spring.application.name=weekthreespring.datasource.url=jdbc:mysql://localhost:3306/memospring.datasource.username=사용자명spring.datasource.password=비밀번호spring.datasource.driver-class-name=com.mysql.cj.jd..

1단계: "Condition '(name != null) && (updatedDate != null)' is always 'false'"

[문제]package com.spring.weekthree.repository;import com.spring.weekthree.dto.PlanResponseDto;import com.spring.weekthree.entity.Plan;import org.springframework.stereotype.Repository;import java.time.LocalDate;import java.util.*;// Data Access Layer(Repository Layer)@Repositorypublic class PlanRepositoryImpl implements PlanRepository { // 속성 private final Map planList = new HashMap(); // ..