본문 바로가기

전체 글89

1년 동안의 기록을 책으로 만들다. 2024년의 첫 글을 무엇으로 장식해볼까라는 고민끝에 2023년에 처음으로 도전해본 결과를 기록해보고자 한다. 나에게는 개발 이외에 꾸준히 하는 활동이 있다. 그것은 바로 "일상을 글로 기록"하는 행위 뭐 매일매일 적는다는 것은 사실상 불가능하지만.. 무채색의 삶에 색깔이 스며들 때의 순간을 기록하고 싶어져서 시작하게 되었다. 사진, 영상도 그 당시의 상황과 풍경을 설명해 주지만 글로 표현할 수 있는 기록과는 결이 다르다고 생각이 들었기 때문이다. 물론, 사진과 영상도 꼬박꼬박 기록하고 있지만! 글로 순간을 표현하는 행위의 이점으로는 그 당시의 감정을 세세하고 다양한 방면으로 표현할 수 있다는 것이다. 이게 얼마나 매력적인가! 사실, 백엔드 개발이라는 것도 어떠한 결과물을 만들기 위한 "과정"일 뿐이지,.. 2024. 1. 2.
[Spring Security] 스프링 시큐리티 에러 메시지 국제화 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. [문제 상황] 팀원이 작업하시면서 이런 문제가 발생했다고 하셨다! 그래서 직접 확인해 보니 로컬에서는 비밀번호를 잘 못 입력했을 때 “자격 증명에 실패하였습니다.” 였고 서버에서는 위와 같이 “Bad credentials”로 응답이 왔다.. 왜 그럴까 생각을 해보았는데에.. 계속 보니 로컬에서 오는 응답과 서버에서 오는 응답 이 둘의 의미가 같은 것 같았다. 그래서 어림짐작으로 로컬은 한국이고 서버는 영어로 되어있나..? 싶었는데 역시 맞았다 → 근거는? 위 블로그를 보면서 “이는 Spring Security 자체에 국제화 메시지 처리가 되어 있기 때문” 이라는 말을 보았고 해당 파일을 직.. 2023. 12. 14.
Object Mother 패턴이란? 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. Object Mother패턴이란? 한 줄로 표현하면 “test Object를 만들어 주는 Class”이다. 테스트 데이터를 작성할 때 많은 예제 데이터가 필요한데 테스트 시점마다 새로운 데이터를 만드는 것이 비효율적인 task라고 생각이 들었고 이를 해결하기 위해 착안된 패턴이 “Object Mother 패턴"이다. 여러 테스트 클래스에서 유사한 데이터가 필요한 경우가 많아 테스트 시점에 standard fixtures를 만들 수 있는 factory object를 만드는 것이다. 장점 단점 재사용성이 증가한다 여러 테스트에 유사한 데이터를 사용하면 사용자들이 테스트 코드에 친숙해질 수 있다.. 2023. 12. 13.
[Spring Security] jwt 401 응답 + jwt 예외 핸들러 만들기 일단 security 예외는 사용자가 만든 spring 핸들러에 걸리지 않는다 이유는 security가 spring이 실행되기 전보다 먼저 실행되기 때문이다.. 사용자가 만든 핸들러는 spring에 걸려있고 security가 그것보다 더 전에 실행하기 때문에 걸리지 않는다 위 그림처럼 Filter가 Request의 가장 앞단에 위치해있고 HnadlerInterceptor가 controller단에 존재한다 이래서 이 게시글을 작성하기 전까진 jwtFilter에서 발생하는 요런 에러들이 GlobalHandler에 잡히지 않았다 (사실 Spring의 GlobalHandler에 잡히는 줄 알았고 코드 문제로 동작이 안 하는 줄 알았다..._) 그래서 겸사겸사 위와 같은 문제들까지 다 해결하기위해 해당 게시글을 .. 2023. 11. 29.
[Spring Security] @AuthenticationPrincipal에 null값 들어오는 문제 해결 방법 https://devjem.tistory.com/70 이 글 보고 참고했다 이 문제가 발생한 경우는 “회원 정보 수정” 기능에 User를 @AuthenticationPrincipal로 가져와야 하는건데 자꾸 나의 User가 null으로 받아와지지 않았다 ㅠㅠ 글을 쭉 읽으면서 security 코드를 천천히 비교하며 보는데 ! 내 경우의 문제는 CustomUserDetailsService의 loadByUserName 함수가 email으로 되어 있어서 그런 것이라고 처음에 접근했다 근데 사실 유저의 바뀌지 않는 값은 email이 맞으니 해당 함수는 문제가 없었다. 그래서 loadUserByUserName의 내부 findByEmail 메소드를 findByName 메소드로 변경했다 근데 findByName으로 .. 2023. 11. 16.
[JPA] deleteAll과 deleteAllInBatch의 차이 UserController.java @DeleteMapping("/carts") @ResponseStatus(NO_CONTENT) public KurlyResponse removeProduct( @AuthenticationPrincipal User user, @RequestBody RemoveCart.Request removeProductList ) { userService.removeProductList(removeProductList, user.getId()); return KurlyResponse.noData(); } UserService.java @Transactional public void removeProductList(RemoveCart.Request removeProductList, Lo.. 2023. 10. 19.
[JPA] JPA가 기본 생성자가 필요한 이유 (feat. final) 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. 1️⃣ JPA에서 기본 생성자를 필요로 하는 이유 JPA에서 Entity는 반드시 public 또는 protected인 기본 생성자를 가져야 한다 이것이 가능한 이유는 JPA가 자바에서 제공하는 리플렉션 API를 활용하여 동적으로 객체를 생성하기 때문이다 만약, 기본 생성자가 없거나 private인 경우 리플렉션 API는 객체를 생성할 수 없게된다. 리플렉션 API란 구체적인 클래스 타입을 몰라도 클래스 이름으로 메서드, 타입, 변수등 클래스의 모든 정보에 접근할 수 있도록 해주는 API이다. 리플렉션을 활용하여 런타임 시점에 동적으로 클래스 객체를 생성할 수 있는데 이때 객체를 생성하기 .. 2023. 10. 12.
[Paging] 페이지네이션을 알고 사용하자 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. 페이징(Paging, Pagination)이란? 프로젝트를 진행하면서 “베스트 상품 페이징”처리가 필요하게 되었고 페이징 처리를 해본적 없는 나는..! 페이징에 대해 먼저 알아보는 것이 먼저였다! 먼저, 페이징이 필요한 이유는 십만개의 데이터가 존재할 때 이 데이터를 한 화면에 한 번에 보여줄 수 없기 때문에 일정 기준으로 끊어서 데이터를 표시하기 위해 필요하다. 만약 서버에 한 요청이 십만개의 데이터를 요청하는 것이고, 이와 같은 요청이 여러 사용자들에 의해 발생한다면? 서버에선 OOM이 발생하는 문제가 생길 수도 있다. 이와 같은 문제들을 해결하기 위해 페이징이 필요하다. 우리가 가장 .. 2023. 10. 2.
[JPA] CASCADE.ALL로 인한 버그 발생 및 해결법 해당 게시글은 "프로그래머스 데브코스 4기"의 팀 내 프로젝트 기록용으로 TECH BLOG에 직접 작성한 글입니다. 문제 상황 상품에 대한 review를 작성하는 api 기능 테스트를 진행하던 와중이었다. (/products/review, 사진의 서비스 메서드 호출) 아래와 같은 에러가 발생하였고 이를 해결했던 과정을 기록하고자 한다. 2023-09-21T17:55:12.524+09:00 WARN 81332 --- [nio-8080-exec-7] c.d.k.g.e.GlobalExceptionHandler : UnexpectedException Occurs : detached entity passed to persist: com.devcourse.kurlymurly.module.user.domain.Use.. 2023. 9. 25.