![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbz1m8%2FbtsgqAL3qfI%2FegC8eIiKmCwrPMfkjqNke0%2Fimg.png)
에어비앤비 클론코딩 프로젝트를 하면서 사용자가 설정한 checkIn, checkOut 기간에 예약이 없는 숙소들만 필터링해서 보여줘야 할 일이 있었다. 내가 선택한 방법은 checkIn, checkOut 기간에 예약이 있는 방번호를 구하고 이 번호에 해당하지 않는 숙소들만 보여주는 방법이었다. 그렇게 하기 위해서는 Reservation 테이블에서 'checkIn, checkOut 기간에 예약이 있는 방 번호'를 서브쿼리를 통해 구하고 메인 쿼리의 where 절에 조건으로 사용해야 했다. SQL문으로 서브 쿼리는 몇 번 써봤지만 querydsl로는 써 본 적이 없어 이런 저런 시도 끝에 내가 원하는 쿼리문을 만들 수 있었다.
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLofHm%2Fbtsgujbknco%2FVFIpx8hMpYgKv935IIy9Xk%2Fimg.png)
스프링부트로 만든 어플리케이션에서 AWS 리소스를 사용하기 위해서 아래와 같은 라이브러리를 추가했다. 그랬더니 이런 에러가 발생했다. 어플리케이션 실행은 문제 없이 되긴했지만 도대체 무슨 에러인가 찾아보니 로컬 환경은 EC2가 아니라서 발생하는 에러라고 했다. 그래서 이를 해결하고자 어플리케이션 실행 시 일부 파일들은 실행하지 않는 방식을 사용했다. 이렇게 해서 EC2 관련 에러는 사라졌지만 S3에 이미지 파일이 저장되지 않는 문제가 발생했다. 에러 메시지를 보니 S3Client의 region과 실제 이미지 업로드를 하려 하는 버킷의 region이 일치하지 않아 발생하는 문제였다. 그래서 직접 출력해서 확인해보니 분명 S3Client를 만들 때 'ap-northeast-2'로 region을 설정하고 있음..
"아쉽지만 좋았다" 이번 주는 프론트엔드 분들과의 첫 협업으로 미니프로젝트를 진행했다. 개인적으로는 미니프로젝트 주차에 채팅 기능을 구현해보고 싶었는데 주제 선정에서 다른 분의 의견이 더 많은 투표를 받아 이미지 업로드가 가능한 페이지를 구현하는 것으로 방향이 잡혔다. 이미지 업로드 역시 한 번도 구현해본적 없는 기능이기에 좋긴했지만 채팅 기능을 구현해보지 못 한 것이 조금은 아쉬웠다. 그래도 프론트엔드 분들과 첫 협업을 하면서 눈에 보이는 성과물을 만들어 내는 것이 재밌었고 완성된 결과물을 봤을 때는 괜시리 뿌듯한 마음도 들었다. 나는 이번 프로젝트에서 파일 업로드를 포함한 게시글 작성 구현을 주로 담당했다. 기능을 구현하면서 겪었던 문제 및 회고 발표 때 들었던 피드백에 대해서 정리하고자 한다. 1...
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCxIxB%2Fbtsd0oBoirV%2FYjmUSV1qFpHFKqKejg95RK%2Fimg.png)
어느덧 벌써 항해 5주차다... 이번 주는 처음으로 프론트엔드분들과의 협업을 통해 미니프로젝트를 진행하는 주차다. 그래서 이와 관련한 라이브 세션을 진행했는데 이 때 CORS 라는 것에 대해 알려줬다. 우리 조는 아직 백엔드 서버 구축이 완료가 안 돼서 CORS 를 만나보지는 못 했지만 프론트엔드와의 협업을 하다보면 매우 쉽게 만나볼 수 있는 문제기에 한 번 정리를 해보고자 한다. CORS(Cross Origin Resource Sharing) 이름 그대로 해석해보면 서로 다른 Origin 끼리 교차해서 자원을 공유하는 것과 관련된 정책을 의미하는데 Origin은 무엇일까? Origin Origin은 URL에서 프로토콜, 도메인, 포트 번호를 합친 부분을 의미한다. 내 블로그 URL은 https://w-..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0qpCB%2Fbtsd9M8cAiw%2FKKRHSuOyC7Hmy0Wf8HOT3K%2Fimg.png)
오늘 겪은 문제 클라이언트로부터 받아온 이미지파일을 AWS S3에 저장하는 과정에서 이런 에러를 만났다. properties 파일에서 spring.servlet.multipart.location=C:\\upload 로 설정해두었는데 여기에 있는 ~~.tmp 파일을 삭제할 수 없다는 에러였다. MultipartFile 타입으로 클라이언트로부터 이미지 파일을 받아오게 되면 임시 저장 공간에 .tmp 파일 형태로 저장하고 이를 최종 저장 공간에 저장 후 생성했던 .tmp 파일은 삭제하는 방식으로 이미지 파일의 업로드가 이루어진다. 그래서 원하는 대로 S3에 이미지 파일이 저장은 됐지만 그 후 .tmp 파일을 삭제하는 과정에서 에러가 발생해 내 C드라이브 아래 upload 폴더에 .tmp 파일들이 잔뜩 쌓이게 ..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsIsB7%2FbtsdQLoemIE%2FUZHKqm2ci8KlcCpmk9ey00%2Fimg.png)
오늘 겪은 문제 Lv5 를 넘어서 디벨롭하는 과정 중에 전체 게시글 조회 시 출력되는 내용의 변경이 필요했다. 기존에는 게시글과 거기에 달린 댓글들이 전부 출력되는 형태였는데 이를 변경하여 게시글과 거기에 달린 댓글의 숫자를 출력해야했다. 그래서 처음에는 Post를 PostResponseDto 로 변환할 때 댓글 리스트 대신 리스트의 사이즈를 담을 필드를 만들어야겠다고 생각했다. 그런데 이 방법은 어찌됐건 게시글에 달린 댓글을 DB에서 전부 가져와서 작업을 해야하는 방식이기에 애초에 조회할 때부터 갯수를 카운팅해서 그것만 가져오게 만들고 싶었다. 아마 이를 위해서 DB에게 실제로 날려야 할 쿼리는 select p.*, count(c.comment_id) from post p left join commen..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE8N1J%2FbtsdxhOqlkn%2FzKP48UM7gGzV4YS54Qa0KK%2Fimg.png)
오늘 겪은 문제 회원 탈퇴 시 이와 연관된 데이터(게시글, 댓글, 좋아요 등)를 모두 삭제하도록 만들고 싶었다. 기존에 A 데이터를 삭제 시 연관된 B 데이터도 삭제 되게 하는 것은 양방향 연관관계를 맺고 CascadeType.REMOVE 라는 옵션을 통해 해결했었다. 하지만 User 클래스는 User를 조회할 때 연관된 다른 데이터들을 같이 조회할 일이 없어 양방향이 아닌 단방향 연관관계를 맺어놨고 그렇기에 CasCadeType.REMOVE 라는 옵션을 사용할 수 없었다. 처음에는 User와 연관된 모든 데이터들을 불러 객체로 만들고 jpa 를 이용해 삭제시키는 방법을 생각해봤다. 하지만 이는 User와 연관된 데이터 종류가 많아질수록 코드도 굉장히 늘어나 비효율적인 방법이라고 결론을 내리고 다른 방법..
이번 주 매니저님 면담 시간에 매니저님께서 JPA가 뭐냐? 라는 질문을 했다. 정확히는 모르는데 어디서 객체, 관계, 매핑 이런 단어들을 주워들은 기억이 있어 생각나는 대로 말했더니 매니저님께서 비슷하긴 하지만 JPA 하면 ORM 이라는 단어가 꼭 등장해야 한다고 하셨다. 그래서 ORM에 대해서 정리를 좀 해보고자 한다. ORM(Object - Relation Mapping) 자바에서 사용하는 객체가 관계형 데이터베이스의 데이터를 매핑(연결)하는 것을 의미한다. MVC 패턴에서 Model 단에서 해야하는 일들과 관련이 있다. 객체를 구현하는 '클래스' - 관계형 데이터 베이스의 '테이블' 클래스로 구현한 '객체' - '테이블'의 데이터(record) ORM의 장점 - 개발자가 쿼리문을 직접 짜지 않아도 ..