분류 전체보기
-
'신청' 모델 추가를 위한 객체 설계Today I Learned 2022. 11. 18. 23:58
게시글 상세 내용을 서버에서 가져와 정보를 출력해주는 부분까지 구현했다. 일단은 사용자가 신청한 글의 신청취소 버튼을 누를 시 참가 정보가 즉시 삭제되어 반영된다. 다음으로 구현할 사항은 신청 시 즉시 참가자 목록에 반영되지 않고 '신청' 단계를 거치게 하는 것이다. 다음과 같이 동작하게 하는 것을 계획하고 있다. 1. 운동에 참가를 희망하는 사용자가 신청 버튼을 누르면 게시글 목록과 게시글 상세 정보에 나타나는 신청 버튼은 신청취소 버튼으로 변경된다. (게시글 상세 내용 보기 기능에도 신청/신청취소/참가취소 버튼을 추가할 계획이다.) '신청' 상태는 운동에 참가가 확정된 것이 아니기 때문에 게시글 상세 내용을 확인해도 참가자 정보에 해당 사용자의 정보는 나타나지 않는다. 2. 모집 게시글을 작성한 사용..
-
밀린다Today I Learned 2022. 11. 17. 23:07
게시글 상세 정보 조회를 위한 로직을 이틀에 걸쳐 구현을 진행 중이다. 특정 게시글이 포함하고 있는 게시물 내용, 경기 정보, 참가자 목록 정보를 백엔드 서버로부터 가져와 사용자, 신청자, 신청자가 아닌 사용자에 따라 UI를 구분해 출력되도록 하는 것이 작업의 최종 목표이다. 월요일에 작업 목록을 새로 작성할 때, 작업이 너무 클 것 같아 작업 단위를 나눴었다. 먼저 게시글을 구성하는 각각의 리소스인 '게시글', '경기', '참가자'에 대한 내용을 일단 가져와 출력하기만 하게 구현한 뒤, DTO에 추가적으로 같이 전달하게 하는 사용자 식별을 위한 값을 이용해 컴포넌트가 출력할 내용을 구분하는 내용을 구현할 계획이었다. 남은 일정과 작업 목록을 고려한다면 오늘이 끝날 때쯤에는 적어도 리소스를 출력하는 로직..
-
@RequestBody에 매핑되는 DTO는 왜 빈(empty) 생성자가 필요한가?Today I Learned 2022. 11. 16. 13:24
임시 로그인을 구현하기 위해 백엔드 로직을 작성하던 중 한 가지 난관에 봉착했다. LoginRequestDto를 받아와 처리하는 Controller의 동작을 정의하기 위해 테스트 코드를 작성하던 중, @RequestBody에 매핑된 LoginRequestDto를 생성할 수 없다는 에러 메세지가 출력되면서 테스트가 실패하는 것을 확인했다. // SessionController.java @RestController @RequestMapping("session") public class SessionController { // Beans, Constructors @PostMapping @ResponseStatus(HttpStatus.CREATED) public LoginResultDto login( @Vali..
-
인수 테스트는 개발자가 아닌 사람들도 이해할 수 있어야 한다Today I Learned 2022. 11. 15. 14:33
문서에 작성했던 인수 테스트의 내용을 소스코드로 옮긴 테스트 코드가 통과하지 못하고 있었다. 실 사용 화면에서는 DB에 있는 데이터들을 잘 가져오고 있었는데, CodeceptJS로 테스트를 실행하면 계속해서 상태를 가져오지 못하는 것을 확인했다. 처음에는 실행 순서상으로 페이지가 렌더링되고 상태를 가져오기까지 잠깐 동안 출력될 수 있는 Guard Clause로 인해 테스트를 통과하지 못하는 것인가 싶어 페이지 이동 후 대기하게 하는 식으로 수정해보았지만 여전히 게시물을 가져오지 않았다. 동료분과 인수 테스트의 어느 지점에서 막히고 있는지 과정을 하나씩 살펴보았다. // tests/posts_test.js Scenario('동록된 게시글이 존재하는 경우', ({ I }) => { // Given I.set..
-
메가테라 웹 개발자 과정 20주차 주간 회고주간 회고 2022. 11. 14. 07:11
3주차 스프린트 주간 작업 목표 및 성과 분석 주간 작업 목표 : 제품의 MVP를 제작해 의도한 가치를 전달하는지 확인한다. 상세 목표 - 최소 기능에 대한 프로젝트 설계 문서 완성 - 기존 사용자 스토리 반려 - 최소 기능 사용자 스토리 작성 - 작업 목록 재작성 - 최소 기능 구현 - 모델 최소화 - 운동 게시글 목록 조회 - 운동 참가 신청 - 운동 참가 취소 설계 없는 구현, 검증할 수 없는 구현은 밑 빠진 독에 물 붓기 이번 주차는 지난 1, 2주차 스프린트 주간에 어떤 문제가 있었는지 깨닫고 방향성을 바로잡기 위해 몸부림쳤던 한 주였다. 작업 속도도 지지부진했는데 그마저도 결과물이 나오지 않았던 이유는 무엇이었나. 사용자 스토리가 가치 중심이 아닌 화면 중심이었다. 사용자 스토리를 다시 돌아본..
-
테스트를 짤 때 느껴지는 이상함은 구조 분리의 신호Today I Learned 2022. 11. 14. 06:33
어제 사용자가 신청하지 않은 운동 게시글에 운동을 신청했을 때, 예외가 발생할 경우 예외 메세지를 출력하게 해주는 로직의 UI 컴포넌트 부분과 테스트 코드를 작성하는 과정에서 겪었던 이슈가 있었다. 아래의 소스코드와 테스트 코드를 보자. // src/components/Posts.jsx import styled from 'styled-components'; // Definitions of styled components // ... export default function Posts({ posts, postsErrorMessage, registerErrorCodeAndMessage, registerToGame, cancelRegisterGame, }) { const handleRegisterToGame..
-
Flux 구조에서의 상태 관리 책임의 분리Today I Learned 2022. 11. 12. 22:32
엊그제 운동 참가 신청 최소 기능을 구현하는 과정에서 고민했던 부분이 있었다. 신청 버튼을 누르면 API 서버에 POST 요청을 보내고, 응답으로 신청된 경기의 식별자가 있으면 게시물 목록을 다시 가져오게 하려고 했다. 상태 하나를 저장하기 위해 굳이 Store까지 만들어야 할까 생각이 들어 페이지 컴포넌트가 바로 API 요청을 호출하면 안 되는지 질문을 올렸다. 또 한번 강의에서 배우지 않은 내용대로 하려고 했음을 인지하고 Store에서 API를 호출하고, 응답으로 돌아온 신청된 경기의 식별자를 Store에 저장한 뒤 페이지 컴포넌트에서는 Custom hook으로 Store가 들고 있는 상태에 접근하도록 했다. 물론 비동기 처리만 해 주면 페이지 컴포넌트가 API를 바로 호출하게 해도 문제는 없다. 그..
-
인터페이스는 내가 쓰기 편해야 한다Today I Learned 2022. 11. 12. 22:31
어제 완성했던 최소 기능의 게시글 목록 조회, 신청 기능을 테스트하는 테스트 코드에 한 가지 문제가 남아있었다. 테스트 코드에서 사용될 인스턴스들을 만들기 위해 사용하는 fake 메서드만을 봐서는 post나 game, member에 대체 어떤 값을 줘서 fake 인스턴스를 만드려는 건지 알 수 없었다. 그래서 오늘 가장 먼저 수행할 작업으로 객체들이 가진 식별자와 필드를 값 객체로 분리시키는 작업을 계획했다. 필드를 값 객체로 분리시키는 작업은 값 객체로 분리시킬 객체를 @Embeddable 어노테이션이 붙은 객체로 분리하고, 객체 내에서 쓰일 값 객체에 @Embedded 어노테이션을 붙이는 것으로 분리할 수 있었지만, 식별자 필드를 값 객체로 분리시키는 것은 써본 적이 없었기 때문에 값 객체를 쓰는 식..