프로젝트

[과제] 셀프 코드리뷰

sian han 2022. 11. 5. 19:30

 

Project github : https://github.com/HAN-SEOHYUN/Limit-FileExtension

 

 

 

 

 

 

▶ 엔티티 설계

확장성을 고려했다.

Type에 관계없이 확장자를 필요한대로 추가, 수정할 수 있다.

 

FIX, CUSTOM 클래스를 만들어 테이블을 각각 생성하는 것도 고려해보았으나

PK가 겹칠 가능성을 안고 가야해서 그만두고,

FileExtension 클래스에 ExtentionType enum 클래스를 멤버변수로 넣었다.

 

String 혹은 boolean 을 통해 FIX, CUSTOM 을 구분할 수 있었지만

상태와 행위를 한곳에서 관리할 수 있는 enum 클래스를 선택했다.

 

 

 

 

▷ FileExtesion 클래스 하나만 만들어서 생겼던 문제점

각각 테이블을 만들었다면 findAll() 메서드를 이용해 응답받은 데이터를 가공없이 바로 뷰로 리턴할 수 있었겠지만, 

index.html 로 응답될 FIX, CUSTOM List 객체 2개가 응답되는 비즈니스 로직을 짜야했다.

List<ResponseDto> 객체를 2개 선언하고

조회된 데이터를 각각(FIX, CUSTOM) 넣어 

HashMap<Type, List<ResponseDto>> 로 리턴했다.

 

 

 

 

 

 

 

DTO를 정의하여 요청과 응답의 객체로 사용

엔티티 클래스를 직접 요청, 응답 객체로 사용하면

엔티티 클래스가 (만약) 클 때, 필요하지 않은 다른 데이터까지 전송에 참여하게된다.

 

따라서 클래스 크기에 무관하게

상황에 맞춰 필요한 DTO 를 생성하여 데이터 운반에 사용했다. 

 

 

 

 

 

 

▶ Ajax

사용자 입장에서 생각해보면

checkbox 를 클릭하면 새로고침 없이 적용되고

추가 버튼을 눌렀을때 입력한 값이 바로 textarea에 적용되는 것이 이용하는데에 안정적일거라고 생각되어

Ajax 비동기 통신을 사용했다.

 

 

 

 

 

 

 

 

▶ 어려웠던 점 ?

한페이지 안에서 block 으로 구간을 나눠

block 별로 페이지 렌더링이 될 수 있도록 구현했다.

 

예를 들어 추가버튼을 눌렀을때 또는 checkbox를 클릭했을 때

서버는 요청을 처리하고, 업데이트 된 block 만 응답해준다.

 

replaceWith 를 통해 block 별로 각각 랜더링 되는 것이다.

 

예를 들어 추가 버튼을 누르면 서버는 요청을 처리하고

업데이트된 데이터를 list 에 담아 id를 통해 view 객체에 직접 매핑하여 String 형태로 리턴한다. 

 

그럼 클라이언트에서는 매핑된 데이터를 인자로 넘겨받아

success 시 실행할 동작에 사용하는 것이다.

 

문제 : 

서버는 '등록됨' 과 '등록불가' 두개의 결과를 응답할 수 있다.

위와 같이 '등록됨' 은 정상적으로 작동하는데

'등록불가' 는 사용자에게 표현할 방법이 없어진다.

 

해결 : 

ResponseEntity 클래스를 사용하여 문제를 해결했다.

ResponseEntity 클래스를 통해 error 로 응답받아 메세지를 노출해보기로 했다.

 

 

유저에게서 잘못된 요청을 받으면 도착하는 badRequestMessage API

ResponseEntity 를 통해 BAD_REQUEST 400 코드를 반환하도록 설계했다. 

 

 

사용자의 요청에 대해 Bad Request 가 리턴되면

error 시 수행할 코드가 실행되는 것이다. 

 

 

 

 

 

 

 

 

아쉬운 점

코드를 다시 뜯어보며 생각해보니

사용자요청 -> 서버 요청처리 후 리턴할때 map 으로 리턴을 하면

일부러 error 를 일으키지 않고도 사용자에게 '등록불가' 메세지를 보여줄 수 있는 방법이

있지 않았을까싶다.