회고

231103 코드스쿼드max 자유 프로젝트 4주차 회고

지안22 2023. 11. 5. 22:09

이번주는 코드스쿼드의 공식적인 마지막 주이니 만큼, 기획에 대한 회의보다는 몇가지 안되더라도, 완성된 기능을 보여줘야한다는 마음이 가장 컸는데, 그럼에도 불구하고 기획에 대한 회의를 완전히 배제할 수는 없었다.

원래는 공연장 목록 조회 시에 날짜와 시간순에 대한 필터 기능을 넣기로 했었지만, 공연장에 이러한 필터 기능이 있는 것 보다는 공연에 있는 것이 더 자연스러운 것 같아 필터 기능을 빼기로 했다.

그러고 나니 우리 사이트가 디자인 외에 네이버 지도와의 차별성이 느껴지지 않아서 추가로 무언가 특색 있는 기능을 넣으면 좋을 것 같다는 생각이 들었다.

그래서 일단 공연 목록 기능을 추가하여 날짜 필터 기능을 이쪽에 적용하기로 했다.

하지만 여태까지의 사용성은 앞단(프론트)에서 일어나는 사용성이고, 백엔드에서의 사용성은 성능 및 시간 개선적인 부분이기 때문에 모두의 포트폴리오가 될 이 프로젝트가 모두에게 각자 자리에서 잘 어필이 되게 하려면 어떻게 해야할 지 조금 혼란스럽기도 했다.

나도 전체를 생각하면 결정을 쉽사리 내릴 수 없어 스스로 답답한 마음이 들었다.

 

기획 변경

프로덕트 디자이너인 다니가 여러가지 아이디어를 제시해주셨다.

처음에는 제시해주신 아이디어 중 이루지 못하는 이유를 일일이 설명했는데, 그게 다니로 하여금 혼란을 주는 행위라는 생각이 들었다.

그래서 제시해주신 아이디어 중에 괜찮은 요소를 뽑고, 일단 이번주는 구현해야하는 기능이 있으니 예정대로 진행하고 다음주에 해당 아이디어를 가지고 구체화 해보면 좋겠다고 말씀드렸다.

내가 제시한 아이디어이니 팀원을 잘 이끌어 가면 좋겠는데 팀장으로서 역량이 부족한 것 같아 아쉬움이 들었다.

 

백엔드 요소

10/30 (월)

이번주에는 지도와 관련된 기능 전부 구현하기로 했다.

페이징을 다뤄보는 것은 처음이었는데, Pageable 라이브러리, QueryDSL을 동시에 사용해서 그런지 어려워서 하루안에 끝내지는 못했다.

PR 방식, 깃 플로우, 테일러링 가이드

PR

 

10/31(화)

데이터 수집해서 DB에 넣는데에 오전 시간만 할애하면 될 줄 알았는데 하루종일 걸렸다.

이 과정에서 Entity size 설정을 해놓지 않았다는 사실을 깨닫게 되어서 기본으로 설정해주는 size를 초과하는 부분만 size 설정을 해줬다.

@Column(length = 500)
private String thumbnailUrl;

또한 enum을 관리하기 위해 클래스를 만들어 Entity에 설정해주었다.

// 공연장 영업 시간
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class VenueHour {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	@Enumerated(value = EnumType.ORDINAL)
	@Column(nullable = false, length = 10)
	private DayOfWeek day;
	@Column(nullable = false, length = 20)
	private String businessHour;
	@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
	@JoinColumn(name = "venue_id")
	private Venue venue;
}

 

// DayOfWeek 라이브러리 활용
@RequiredArgsConstructor
public enum DayOfWeek {
	MONDAY("월요일"),
	TUESDAY("화요일"),
	WEDNESDAY("수요일"),
	THURSDAY("목요일"),
	FRIDAY("금요일"),
	SATURDAY("토요일"),
	SUNDAY("일요일");

	private final String name;

	private static final DayOfWeek[] ENUMS = DayOfWeek.values();

	public static String getName(int index) {
		if (index < 0 || index > 6) {
			throw new DateTimeException("Invalid value for DayOfWeek: " + index);
		}
		return ENUMS[index].name;
	}
}

 

11/1 (수)

쿼리 짜는게 미숙한데다가 queryDsl까지 사용하려니 구현하는데 오류를 많이 만나서 완료하는데까지 시간이 오래걸렸다.

확실히 주먹구구식으로만 문제를 해결하니 시간도 오래 걸리고, 잘 모르고 사용한 부분에서 에러가 많이 발생해서 공부의 중요성을 다시금 깨닫게 되었다.

- innerJoin과 leftJoin의 차이점을 잘 알지 못해 의도한 값을 출력하지 못했다.

- java17에서 추가 된 record는 기본 생성자 설정이 안되어 맵핑 불가, NoSuchMethodException이 발생했다.

- isEmpty()라는 메서드 안에 로직을 작성했는데, 속성값으로 추가되어 반환되는 일이 발생, 알고보니 isOOO() 이런식으로 이름을 지으면 json을 타고 나가면서 자동으로 생성되어 반환된다고 한다.

- queryDsl로 작성한 쿼리 중에 찾는 값이 없어도 속성 값에 null이 넣어진 객체가 List에 1개는 무조건 반환되는 일이 발생했다. queryDsl의 쿼리를 수정하는 등의 근본적인 해결을 하지는 못했고, 대신 List의 size가 1개이면서, 속성값이 다 null이면 빈 배열을 반환하는 로직을 직접 작성해서 해결했다.

 

11/2 (목)

RequestParam으로 받던 Pageable을 현재는 request로 int page만 받고 있으니 검증을 위해 RequestParam을 int page로 변경 후 controller에서 service로 page의 담당을 옮겨, PageRequest에 page를 넣어 직접 생성하게 되었다.

- page는 @Min을 사용해 최소값을 검증하는 법을 알게 되었다.

- 기존에는 입력받은 page로 최대 페이지를 구하는 로직을 직접 작성 했었지만, maxPage를 구해주고, 최적화까지 해주는  PageableExecutionUtils 라이브러리가 있는 것을 알게 되어 이를 사용하는 것으로 변경하게 되었다.

- 이것 저것 실험해보다가 재미있는 것을 발견했다. 해당 오류는 querydsl를 사용한 vo 맵핑 과정에서 기본 생성자를 제거하며 테스트를 해보다가 일부러 vo에 있던 getter을 빼서 생긴 오류였는데, 포스트맨의 반은 제대로 나오고 반은 에러가 뜨는 이상한 상황이 발생해서 재밌었다. 아직 확인하진 못했지만 도대체 어디에서 잘못된건지 궁금하다.

- 자꾸 코드 구조적인 의문이 생겨 생각하고 다른 사람과 상의하고 수정하느라 기능 구현을 빠르게 못해서 아쉬움이 남았다.

 

11/3 (금)

프론트와 배포환경에서 공연장 상세 조회 기능까지 잘 되나 확인해보려고 오전에 월간 공연 일정 유무 조회 API를 빠르게 만들어보았다.

모두가 머리를 맞대서 만들어서 그런지 빠르게 완성되었다. 든든한 팀원들이 있어 다행이었다.

 

소감

구현을 늦게 시작해서 목표했던 기능들을 다 구현할 수 있을지 걱정했었는데, 생각보다 빠르게 기능들이 구현되어 다행이었다.

아직 문의 페이지와 어드민 페이지는 완성하지 못했지만, 앞으로 상의해서 만들 새로운 기능과 함께 만들어나갈 수 있지 않을까 생각해본다.