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 를 일으키지 않고도 사용자에게 '등록불가' 메세지를 보여줄 수 있는 방법이
있지 않았을까싶다.
'프로젝트' 카테고리의 다른 글
[Kotlin 토이프로젝트] Handling Exceptions (0) | 2022.11.18 |
---|---|
[Kotlin 토이프로젝트] 프로젝트 구조설계 (0) | 2022.11.18 |
[ERROR] 프로젝트 빌드 에러 : Execution failed for task ':compileJava'.> invalid source release: 11 (1) | 2022.11.04 |
[LOG] Logback 로그관리 (0) | 2022.10.22 |
[SpringBoot & JPA 프로젝트] 카카오 전체 오류로 인해 서비스 이용불가 => 네이버 로그인 API 적용 (0) | 2022.10.17 |