개발하다 생긴 일

끝난 프로젝트도 다시보자 (1)

로그관리자 2023. 3. 30. 01:11
728x90

팀프로젝트 리빌딩 첫 번째

 

제가 맡았던 부분은 객실의 상세정보와 예약 파트입니다.

 

 

1. 변수 명은 특징이 잘 드러나게 

 

-  처음(오랜만에) 프로젝트를 열었을 때 Room 클래스의 id에 주석이 없어서 id가 대체 어떤 데이터를 담고 있는지 한 번에 파악하기 어려웠습니다. DB를 확인하고 나서야 고유 값(호실이 아닌 방 번호)을 설정하기 위함을 알았고 주석을 추가하였습니다. 주석을 달지 않고도 알 수 있도록 하는 것이 좋은 변수 네이밍이라 생각합니다.

- no가 클래스마다 하나씩 있습니다. 만약 실제 프로젝트에서  조인을 해야 하는 수많은 클래스들에 no라고만 되어있는 변수가 하나씩 있다면...😹 Room의 no는 RoomNo, RoomRev의 no는 RoomRevNo, Dto의 no는 DtoRevNo정도라고 하면 좋을 것입니다.

 

 

2. NoSuchRoomException 정의 

 

조상 예외 클래스로 정의된 ApplicationException을 상속받아 객실 예약 전용인 NoSuchRoomRevException 클래스를 정의하였습니다.
예약 조회 또는 예약 취소, 변경(예약 조회를 거치는 로직)시 발생 할 수 있는 예외에 사용할 것입니다. 

 

 

 

3. 비회원 예약 조회 구현 

 

3.1 Service

조건을 걸어 1차 필터링을 거칩니다. 조건에 맞지 않는 경우 NoSuchRoomRevException을 발생시키고, 통과된 데이터는 리턴하도록 합시다.

 

3.2 Controller

매개변수로 예약 시 발생한 revNo(예약번호)와 name(사용자 이름)을 받아 view로 반환할 model에 담아줍니다.  그리고 url 주소에는 예약번호를 담을 것입니다.

 

 

 

4.  비회원 예약 변경 구현

 

예약을 취소하려면 status를 "R" → "D" 로, deleted를 "N" → "Y"로 변경해야 합니다.

예약 update시 부분 데이터만 받을 DTO를 따로 생성하였습니다. 

이유?
첫째, RoomRev에서 그대로 몇 가지 데이터만 변경하게 되면 그 몇 개를 위해 전부 전송해야 하므로 리소스 낭비가 있습니다. 
둘째, Entity는 DB와 연결된 핵심 클래스라 Entity클래스를 기준으로 테이블이 완성되고 데이터의 구조와 제약 조건이 변경됩니다. 그렇기 때문에 다양한 계층에서 Entity를 사용하게 된다면 원치 않는 변경이 일어날 위험이 있으며 모든 속성이 외부에 노출될 가능성이 있습니다. 

근데 여기서 한가지 문제가 있습니다.

DTO에 status(예약 상태)와 deleted(예약 취소)를 담는다면

예약을 취소하려면 status를 "R" → "D"로, deleted를 "N" → "Y"로 변경하기로 하였습니다. << 를 적용해야 하므로  dto의 특징(그저 계층 간 데이터를 전송하는 단순 통신용 데이터 전달 객체)과 멀어지게 됩니다. 😵‍💫 

객체 안의 값을 비교(.equals())해야하는 status와 deleted는 Roomrev에서 변경하고, 나머지 변경 대상은 Dto 클래스 안에 넣어주기로 합니다.

 

 

🤡  BuilderException, TypeException, ClassNotFoundException 

mapper.xml에 먼저 dto가 들어간 쿼리를 작성하니 이런 에러가 땅 땅 땅 떴다. 

mybatis-config.xml에 @Alias 어노테이션 패키지 지정에 dto를 넣어주니 세 가지 에러가 해결되었습니다.

 

 

🤡 org.apache.ibatis.exceptions.toomanyresultsexception 

잉 갑자기 잘 되던 객실별 정보페이지에 에러가 떴습니다.
에러 본문을 살펴보면 눈을 크게 뜨고 봐야합니다.  어느 줄에 잘 못된 코드가 있는지 친절하게(?) 알려줍니다.
아 controller에 54번 줄, 아 Service에 105번 줄 네네  

리턴 결과가 1개나 0개 여야하는데 4개가 나온다고 합니다. 살펴봅니다. 

Mapper.xml에서 해당 쿼리를 복사해 sql조회해보니

이 친구인 것 같습니다. 

Service로 돌아가 RoomInfo 로직을 봅니다. 흠 

Mapper에서 가져올 때 List<RoomInfo> 로 안 하고 아래 새 room객체를 만들 때 List.of로 만들어줬네요? 

바꿔줍니다.
List<RoomInfo> 로 받을게요~ List.of 지울게요. 깔끔해졌습니다.

덤으로(?) 다시 객실 Detail페이지가 잘 작동됩니다. 

 

2부에서 계속됩니다.

728x90