본문 바로가기
포스코x코딩온

[포스코x코딩온] 풀스택 부트캠프 4차 프로젝트 -5

by 김선지 2024. 3. 18.

논리삭제를 구현했다.

논리삭제의 대상은 유저와 코디, 옷장으로 정했다. 좋아요 같은 경우는 쌓인 데이터가 별다른 기능을 하지 않을 것 같았고, 좋아요를 취소하는 경우는 대부분 잘못 누른 것이기 때문에 쌓인 데이터로 무엇을 할 수 있을 거라고는 생각하지 않기 때문이다.

그래서 acitve column을 하나씩 만들고 default를 true로 설정, 삭제 시에는 active를 false로 하고, 모든 fetch 요청에서는 active가 true인 값만 가져오게끔 하면서 구현할 수 있었다.

 

이거 하면서 회원탈퇴하고 다시 회원가입 하는 경우, 같은 아이디로 회원가입이 불가능 했던 걸로 기억하는데 그게 논리삭제 때문이지 않을까 생각했다.

그렇게 게시글이나 코디같은 경우도 회원 탈퇴를 하는 경우 active = false로 설정할까 생각했었는데 다른 사이트를 생각해보니까 그냥 탈퇴된 유저라는 식으로만 뜨고 글은 삭제되지 않았던 걸로 기억한다. 그러면 회원탈퇴한 유저의 active를 false로 설정하고 다른 글은 user의 닉네임으로 구분할 수 있으니까 닉네임을 (del_ + uuid의 10글자) 이런 식으로 만들었다. 이러고 나니까 뭔가 멋있다... 

 

다만 그러면 개인정보나 게시글 등도 지워지지 않는다는 뜻이 되는데 이상한 글 싸지르지 않도록 항상 조심해야겠다.

회원탈퇴하면 active 는 false

 

 

 

이제 코디 관련한 api를 만들 차례다.

 

코디의 경우 어떻게 짜야할지, 사진을 여러개 올리는건지 잘 몰라서 팀원들과 회의를 한 결과 자기가 가지고 있는 옷 중에서 몇가지를 골라서 게시글을 만들듯이 올리는 방식으로 잡았다.

그렇게 된다면 그냥 user 테이블과는 N:1로 정하고  closet의 인덱스만 알 수 있으면 될 것 같다.

일반적으로 테이블과의 관계는 join을 하기 위한 거지, 동일한 데이터가 들어간다고 해서 계속 관계를 맺는 것이 아니라고 한다. 강사님께 물어보니까 이렇게 짜는거 아니라고 한다.

 

즉 이 테이블의 경우 아래와 같이 다른 테이블의 정보가 userIndex와 다른 closet의 index를 모두 포함해서 굉장히 많은데 이걸 다 관계로 정하는 게 아니고, user의 경우 특정 user가 가지고 있는 코디에 대한 정보와 관계가 있으므로 관계를 설정하는 거고, 저렇게 closet의 경우에 전부 관계를 맺으면 복잡하기도 하기 때문에 그냥 관계를 맺지 않고 index를 기준으로 closet table의 데이터를 두번 가져오는 식으로 쿼리를 진행하는 걸로 했다.

효율성있게 하기 위해서 코디에 showing column을 추가해서 default는 false이고 true 로 바꾸면 게시판에 뜰 수 있게끔 만들었다.

 

 

 

또한 여러 군데 구글링 하면서 찾아봤는데 response로 다들 ResponseEntity라는 엔티티가 들어가 있길래 직접 커스텀으로 만든 건가 했더니 spring boot에서 지원해주는 클래스였다. (물론 DefaultRes는 커스텀이다.)

모든 response의 틀을 동일하게 만들기 위해서 쓰는건가 보다.

그래서 return의 포맷을 전부 ResponseEntity로 바꿔주었다.

 

이걸 처리하면서 갑자기 든 생각이 그렇다면 오류처리 핸들러도 이렇게 직접 설정할 수 있겠다는 생각이었다.

서비스 단에서 에러가 생길 때 throw를 해도 postmanAPI에서 해당 오류가 뜨지 않은 이유가 이거였던 것 같다.

오류라고 해도 return을 해야 브라우저 측에서 그 response를 받을 수 있는데 exception이 service 단에서 throw 되었을 때 controller에서 그 exception을 handling 해야 하는데 한번 더 위로 throw를 해서 그런 거였다. 그래서 try and catch 구문을 통해서 브라우저 측에서 에러 response를 보낼 수 있게 되었다.

 

 

근데 이건 restAPI의 기능만 하니까 결과적으로 유저에게 페이지를 띄워주는 건 프론트 단에서 진행해야 한다.

이건 프론트분들이 보실 에러라고 생각하면 될 것 같다.