개발 블로그
article thumbnail
[WIL] Week 5
항해99 2023. 5. 7. 20:49

어느덧 벌써 항해 5주차다... 이번 주는 처음으로 프론트엔드분들과의 협업을 통해 미니프로젝트를 진행하는 주차다. 그래서 이와 관련한 라이브 세션을 진행했는데 이 때 CORS 라는 것에 대해 알려줬다. 우리 조는 아직 백엔드 서버 구축이 완료가 안 돼서 CORS 를 만나보지는 못 했지만 프론트엔드와의 협업을 하다보면 매우 쉽게 만나볼 수 있는 문제기에 한 번 정리를 해보고자 한다. CORS(Cross Origin Resource Sharing) 이름 그대로 해석해보면 서로 다른 Origin 끼리 교차해서 자원을 공유하는 것과 관련된 정책을 의미하는데 Origin은 무엇일까? Origin Origin은 URL에서 프로토콜, 도메인, 포트 번호를 합친 부분을 의미한다. 내 블로그 URL은 https://w-..

article thumbnail
[TIL] DAY 34
항해99 2023. 5. 7. 00:43

오늘 겪은 문제 클라이언트로부터 받아온 이미지파일을 AWS S3에 저장하는 과정에서 이런 에러를 만났다. properties 파일에서 spring.servlet.multipart.location=C:\\upload 로 설정해두었는데 여기에 있는 ~~.tmp 파일을 삭제할 수 없다는 에러였다. MultipartFile 타입으로 클라이언트로부터 이미지 파일을 받아오게 되면 임시 저장 공간에 .tmp 파일 형태로 저장하고 이를 최종 저장 공간에 저장 후 생성했던 .tmp 파일은 삭제하는 방식으로 이미지 파일의 업로드가 이루어진다. 그래서 원하는 대로 S3에 이미지 파일이 저장은 됐지만 그 후 .tmp 파일을 삭제하는 과정에서 에러가 발생해 내 C드라이브 아래 upload 폴더에 .tmp 파일들이 잔뜩 쌓이게 ..

article thumbnail
[TIL] DAY31
항해99 2023. 5. 3. 20:41

오늘 겪은 문제 Lv5 를 넘어서 디벨롭하는 과정 중에 전체 게시글 조회 시 출력되는 내용의 변경이 필요했다. 기존에는 게시글과 거기에 달린 댓글들이 전부 출력되는 형태였는데 이를 변경하여 게시글과 거기에 달린 댓글의 숫자를 출력해야했다. 그래서 처음에는 Post를 PostResponseDto 로 변환할 때 댓글 리스트 대신 리스트의 사이즈를 담을 필드를 만들어야겠다고 생각했다. 그런데 이 방법은 어찌됐건 게시글에 달린 댓글을 DB에서 전부 가져와서 작업을 해야하는 방식이기에 애초에 조회할 때부터 갯수를 카운팅해서 그것만 가져오게 만들고 싶었다. 아마 이를 위해서 DB에게 실제로 날려야 할 쿼리는 select p.*, count(c.comment_id) from post p left join commen..

article thumbnail
[TIL] DAY 29
항해99 2023. 5. 1. 18:27

오늘 겪은 문제 회원 탈퇴 시 이와 연관된 데이터(게시글, 댓글, 좋아요 등)를 모두 삭제하도록 만들고 싶었다. 기존에 A 데이터를 삭제 시 연관된 B 데이터도 삭제 되게 하는 것은 양방향 연관관계를 맺고 CascadeType.REMOVE 라는 옵션을 통해 해결했었다. 하지만 User 클래스는 User를 조회할 때 연관된 다른 데이터들을 같이 조회할 일이 없어 양방향이 아닌 단방향 연관관계를 맺어놨고 그렇기에 CasCadeType.REMOVE 라는 옵션을 사용할 수 없었다. 처음에는 User와 연관된 모든 데이터들을 불러 객체로 만들고 jpa 를 이용해 삭제시키는 방법을 생각해봤다. 하지만 이는 User와 연관된 데이터 종류가 많아질수록 코드도 굉장히 늘어나 비효율적인 방법이라고 결론을 내리고 다른 방법..

[WIL] 항해 4주차
항해99 2023. 5. 1. 09:42

이번 주 매니저님 면담 시간에 매니저님께서 JPA가 뭐냐? 라는 질문을 했다. 정확히는 모르는데 어디서 객체, 관계, 매핑 이런 단어들을 주워들은 기억이 있어 생각나는 대로 말했더니 매니저님께서 비슷하긴 하지만 JPA 하면 ORM 이라는 단어가 꼭 등장해야 한다고 하셨다. 그래서 ORM에 대해서 정리를 좀 해보고자 한다. ORM(Object - Relation Mapping) 자바에서 사용하는 객체가 관계형 데이터베이스의 데이터를 매핑(연결)하는 것을 의미한다. MVC 패턴에서 Model 단에서 해야하는 일들과 관련이 있다. 객체를 구현하는 '클래스' - 관계형 데이터 베이스의 '테이블' 클래스로 구현한 '객체' - '테이블'의 데이터(record) ORM의 장점 - 개발자가 쿼리문을 직접 짜지 않아도 ..

article thumbnail
[TIL] DAY 27
항해99 2023. 4. 29. 20:44

오늘 겪은 문제 유저 권한에 대한 정보를 JWT 에 담아서 발행한 후 권한 정보 확인이 필요한 요청이 들어올 시 JWT 에 담아뒀던 정보를 확인하고자 했다. 권한은 미리 정해놓은 것들 외에는 들어가면 안 된다고 생각하여 enum을 활용했다. JWT 발행 시 "auth"라는 키에 enum 객체를 value로 집어넣고 추후 확인 시 == 연산을 통해 enum 객체와 일치하는지 확인했다. enum 은 생성자가 private 이라 객체가 하나만 만들어지는 것으로 알고 있었고 따라서 == 연산 시 당연히 내가 원하는 결과가 나올 것이라 생각했다. 하지만 true 가 나오기를 기대했던 연산에 대해서 false 가 나와 혼란스러웠다. 해결 방법 JWT 발행 시 집어넣었던 enum 객체가 다시 확인할 때는 String..

[TIL] DAY 25
항해99 2023. 4. 27. 21:07

오늘 겪은 문제 JWT 유효성 검사를 하는 커스텀 필터를 만들어 UsernamePasswordAuthenticationFilter 이전에 추가하여 유효하지 않은 토큰일 경우 response 에 에러 메시지를 담아 반환하게 했다. 그리고 유효한 토큰일 경우에만 Security Context에 인증 객체를 저장하도록 해서 만약 토큰이 비어있는 경우에는 다음 필터에서 걸러지도록 코드를 작성했다. 그런데 유효하지 않은 토큰에 대해서는 올바르게 처리가 됐지만 빈 토큰(null) 으로 요청을 보낼 경우 필터에서 걸러지지 않고 컨트롤러를 통과해버리는 문제가 있었다. 시도해본 것 1. token == null 일 경우 커스텀 필터를 통과하지 못 하도록 처리 이 방법으로 빈 토큰에 대한 필터링은 가능했으나 애초에 토큰이..

article thumbnail
[TIL] DAY 24
항해99 2023. 4. 26. 20:05

스프링 시큐리티에 대해 학습하던 중 의문이 생겼다. 학습한 내용을 바탕으로 생각했을 때 Security Context 에 있는 인증 객체(Authentication)를 통해 인증이나 인가와 관련된 처리를 하는 것으로 이해했다. 그런데 우리가 만들 서비스의 유저는 1명이 아닌데 모든 유저들의 인증 객체가 하나의 Security Context 에 저장이 된다면 어떤 인증 객체가 어떤 유저에 대한 정보를 가지고 있는지를 어떻게 구분하는 걸까?? 과거에 세션, 쿠키를 이용한 인증 방식에서 하나의 Sesseon ID 마다 서버에 하나의 세션 저장소가 만들어지고 이 저장소 안에 담긴 객체를 통해 인증이 이루어진다고 학습했다. 그래서 Security Context 에서도 이와 유사하게 하나의 Sesson ID 와 하..