"아쉽지만 좋았다"
이번 주는 프론트엔드 분들과의 첫 협업으로 미니프로젝트를 진행했다.
개인적으로는 미니프로젝트 주차에 채팅 기능을 구현해보고 싶었는데 주제 선정에서 다른 분의 의견이 더 많은 투표를 받아 이미지 업로드가 가능한 페이지를 구현하는 것으로 방향이 잡혔다. 이미지 업로드 역시 한 번도 구현해본적 없는 기능이기에 좋긴했지만 채팅 기능을 구현해보지 못 한 것이 조금은 아쉬웠다.
그래도 프론트엔드 분들과 첫 협업을 하면서 눈에 보이는 성과물을 만들어 내는 것이 재밌었고 완성된 결과물을 봤을 때는 괜시리 뿌듯한 마음도 들었다.
나는 이번 프로젝트에서 파일 업로드를 포함한 게시글 작성 구현을 주로 담당했다. 기능을 구현하면서 겪었던 문제 및 회고 발표 때 들었던 피드백에 대해서 정리하고자 한다.
1. 이미지 파일 업로드 시 .tmp 파일을 삭제하지 못 하는 상황
S3 버킷에 이미지 파일을 저장하고 해당 url을 db에 저장하는 방식으로 이미지 업로드를 구현하려 했다. 그런데 이 과정에서 S3에 이미지 업로드는 잘 됐는데 .tmp 파일을 삭제하지 못 한다는 에러가 발생했다.
그래서 에러 메시지에서 알려주는 경로로 가보니 실제로 .tmp 파일들이 어마어마하게 쌓여있었다.
찾아 본 결과 InputStream에서 .tmp 파일을 사용하고 있어서 삭제할 수 없는 상황이었다.
내가 코드를 작성할 때 S3에 이미지 파일과 함께 보내 줄 메타 데이터를 만들어내는 과정에서 MultipartFile 타입의 getInputStream() 메서드를 활용하고 있었는데 이렇게 하다보니 InputStream이 2개가 생기고 그 중 하나가 닫히지 않았던 것이다.
그래서 메타 데이터를 위해서 getInputStream()을 사용하던 방식에서 MultipartFile 타입의 getSize() 메서드를 이용하는 방식으로 변경해서 문제를 해결했다.
2. 프론트엔드로부터 들어오는 데이터 null 체크
중간 피드백 시간에 프론트엔드로부터 전달받는 데이터들에 대해서 반드시 null 체크를 해줘야 한다는 조언을 들었다.
NullPointerException은 컴파일 타임에는 잠잠하다가 런타임에 발생하는 예외라서 자바 개발자들 입장에서 반드시 주의를 기울여야 한다고 하셨다.
그리고 String 타입의 경우 "" 와 같이 아무것도 없는 문자열 데이터는 사실 상 null과 다를바가 없기에 꼭 체크해주어야 한다고 하셨다.
3. 동적 쿼리 사용하기
이번 프로젝트에 필터링 변수 3개를 이용해서 필터링을 진행하는 작업도 했는데 처음에는 나올 수 있는 8가지 경우의 수에 대해서 if else 로 다 분기처리를 하고 각각의 상황에 대해서 정적쿼리를 생성하는 jpql을 작성했었다.
그런데 이렇게 하니 코드 가독성이 너무 떨어졌고 if else 를 남발하다보니 효율도 떨어졌다. 매니저님은 이런 경우에 동적 쿼리를 사용할 것을 추천하셨고 querydsl 이라는 것을 이용해 코드를 간소화 시켰다.
이번 프로젝트에서 처음 querydsl을 사용해봤는데 정말 신세계라고 느꼈고 앞으로도 복잡한 쿼리를 만들어내야 할 때는 자주 애용할 것 같다.
4. save() vs saveAndFlush()
사실 나는 캐치하지 못 했었는데 우리가 각자 맡은 부분에 대해서 각자의 스타일로 코드를 작성하다보니 create를 하는 부분들 중에서 어떤 부분은 save() 메서드를 어떤 부분은 saveAndFlush() 메서드를 사용하고 있었다.
매니저님께서 이 두 메서드의 차이에 대해서 알아보고 어떤 메서드를 어떤 상황에 써야할지에 대해서 고민해보라고 피드백을 주셨다.
두 메서드의 차이는 save() 메서드는 트랜잭션이 커밋되는 순간에 데이터가 실제 DB에 저장되는 방식이고 saveAndFlush()는 메서드가 실행된 순간에 바로 DB에 저장되는 방식이라는 점이다.
사실 우리 프로젝트 코드에서는 보통 save() 가 트랜잭션의 가장 마지막 부분에서 실행이 되고 있기 때문에 두 메서드가 별 차이는 보이지 않지만 이번 기회에 이런 점을 알고 가면 나중에 필요할 때 써먹을 수 있을 것 같다.
'항해99' 카테고리의 다른 글
[TIL] DAY 44 (0) | 2023.05.16 |
---|---|
[TIL] DAY 43 (0) | 2023.05.15 |
[WIL] Week 5 (1) | 2023.05.07 |
[TIL] DAY 34 (1) | 2023.05.07 |
[TIL] DAY31 (0) | 2023.05.03 |