본문 바로가기

💻Spring

(30)
Spring Security 401,403 Custom Response 적용하기 서론 사이드프로젝트 문서 작업을 하며 통합 테스트를 하는 도중, 이전부터 처리가 되지 않았던 403 예외쪽 커스터마이징 문제를 해결해야 겠다는 생각을 했다. 프론트 개발자와 협업을 하며 모든 예외에 대한 응답은 공통 규격을 사용하기로 했었기 때문에 이전에 401 예외는 커스터마이징을 통해 적용이 되어있었으나 403은 자꾸만 아래와 같이 응답을 하고 있었다. 본론 우선 Spring Security는 401에러와 403 에러가 날 때 따로 설정한 Handler가 없으면 위와 같은 응답 형식을 띈다고 한다. 나는 이 내용을 잘 몰랐기 때문에 기존 코드에 꼼수를 통해 401은 예외 처리를 했지만, 403을 위해서는 Spring Security 설정이 필요해 보였다. 따라서 401(인증)과 403(인가)의 Han..
MySQL , JPA 에서의 Batch Insert 적용기 퇴근 후 어제에 이어 사이드 프로젝트에서의 회원 언급 기능에 대해서 작업을 진행하려고 했다. (사이드 프로젝트는 이력서를 올리고, 이력서의 타입이 public하다면 Hub에, private하면 Mentioned 카테고리에 들어가고, Mentioned 카테고리에서는 이력서에 언급된 회원들만 조회 할 수 있는 기능을 기획하였다.) 오늘은 어제의 테스트케이스를 바탕으로 end-point를 구현하려고 하였으나 문득, 이력서가 없는데 어떻게 멘션을 하지? 라는 생각이 들었고, 테스트 케이스를 작성하며 생각했던건 언급을 단 건으로만 추가를 하는 로직으로 작성을 하고 있었다. 하지만 선행 조건으로는 이력서가 존재해야 멘션이 가능하였기 때문에, 단건 추가가 아닌 이력서 작성시 멘션을 추가하는 API를 목표로 구현을 했..
JPA 프록시 객체 equals의 Override 개요 사이드 프로젝트 도중, Spring Security를 통해 인가된 회원을 통해 작업을 진행했다. @AuthenticationPrincipal 어노테이션을 이용해 Members 엔티티를 가져와 작업을 처리했었는데 이 @AuthenticationPrincipal은 SpringSecurity에서 프록시 객체로 전달을 했다. 다른 Domain의 테스트 코드를 작성하는 도중 Members의 일부 필드가 프록시로 되어있는경우 완전히 필드가 매핑되어있는 id가 같은 두 엔티티를 equals를 했을 때 false를 반환을 하였다. 회원 1 엔티티 회원 2 엔티티 나는 이번 사이드 프로젝트의 Members 엔티티에 equals를 재정의 하지 않았었고, 이번에 서비스 코드를 작성하면서 엔티티 자체를 비교해야 하는 상..
Spring OAuth 로그인 및 회원가입 RestTemplate > WebClient 리팩토링 개요 사이드 프로젝트를 하며 OAuth 로그인, 회원가입 부분을 진즉 구현을 해두었지만, 공부를 추가적으로 하다보니 당시에 Rest Template을 이용한 구현이 현재는 Deprecated 되었다는 사실을 알게 되었고 리팩토링을 하기로 결정 했다. WebClient에 대해 더 알고 싶다면 다음 블로그를 참고하자 ! https://velog.io/@yyong3519/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-WebClient SpringBoot WebClient 제목: Spring WebClient 쉽게 이해하기작성자: tistory"happycloud-lee"작성자 수정일: 2021년 2월 20일링크: https://happycloud-lee.tistory.co..
Response 규격화 Swagger 처리 개요 사이드 프로젝트 중, 프론트쪽 친구가 응답을 통일성있게 규격화 시켜달라는 요청이 있어 응답을 다음과 같이 통일화 시켰다. 기존 코드 @PostMapping("/jwt/refresh") @ResponseBody public ResponseEntity refreshAccessToken(@RequestHeader(value = "Authorization") String refreshToken){ RefreshAccessTokenResponseDto response = jwtService.validateRefreshToken(refreshToken); return ResponseEntity.ok(response); } ApiCommonResponse 생성 @Getter @Builder @Schema(des..
OAuth, 일반 이메일 회원가입시 중복관련 Trouble Shooting 개요 사이드 프로젝트 로그인 및 회원가입 구현 중 논리적인 문제와 개발적인 문제에 직면을 했다. 우선 논리적인 문제부터 살펴보면 우리는 자체적인 회원가입과(email과 password 로그인) OAuth 회원가입을 분리를 해놨었고, 같은 이메일로 회원가입을 하더라도 다른 계정이라고 간주를 하자고 정의를 하고 작업을 진행을 했었다. 하지만 프론트엔드 친구와 회의를 하다보니 너무 사용자에게 다양한 회원가입 입구를 뚫어주는 느낌이라는 생각이 들어 OAuth 소셜 간 (google, github, kakao)은 이메일이 같아도 다른 계정으로 간주하고 자체 회원가입과는 같은 email로 간주하기로 결정을 했다. 또한 위 로직으로 작업을 하다보니, 개발적인 문제가 발생하였다. 우리 테이블 구조는 현재 위와같이 oa..
Jenkins 파이프라인을 이용한 SpringBoot 자동배포 2 (젠킨스 파이프라인 생성 및 깃허브 액션 연결) 개요 이번 글에서는 저번 글에서 만들어둔 젠킨스에서 파이프라인을 생성하고 깃허브 액션을 연결하도록 하겠다. 우선 나의 프로젝트는 깃허브에 respal이라는 public한 메인 레포지토리가 있고, application.yml을 관리하는 respal-private이라는 private한 레포지토리가 있고 둘은 깃의 서브모듈로 연결이 되어있다. 따라서 파이프라인에서 메인 레포지토리를 클론하며 서브모듈도 가져오는 작업이 필요했었던 상황이였다. Jenkins x Github 연동 SSH 키 생성 젠킨스에서 깃헙 프로젝트로 접근하기 위해서 애플리케이션 서버 인스턴스에 접속하여 SSH키를 생성한다. ssh-keygen -t rsa 이렇게 하면 ~/.ssh 디렉토리 아래에 id_rsa.pub 와 id_rsa 파일이 생긴..
Jenkins 파이프라인을 이용한 SpringBoot 자동배포 (환경설정) 사이드 프로젝트를 작업을 진행하며, 백과 프론트 서버를 분리해서 운영을 하기로 결정을 하였고, OAuth2 구현을 위해 먼저 작업을 한 파일을 배포를 해야하는 상황이 되었다. 나는 백엔드를 담당하고있었고, 내가 최종적으로 기획하고 싶은 백엔드의 인프라는 다음과 같았다. 개발환경 서버 : EC2 (ubuntu 22.04 LTS , SpringBoot 2.7.11) DB : AWS RDS(MySQL 8.0.28) 언어 : Java 11 JDBC : Spring data JPA , QueryDsl Build : Gradle 인프라 EC2 인스턴스를 총 3개를 사용하여 Jenkins, NginX, 운영서버로 두고, Github에 Push를 하게되면 Jenkins가 자동으로 Gradle로 빌드를 하여 jar fi..