프로젝트 11

[소마] 리팩토링: 로직 개선하기

로직 개선하기복잡한 동적 쿼리 queryDSL 적용 피드 페이지에서 카테고리(도메인)과 제목이나 글쓴이 이름으로 검색하여 피드를 조회하는 기능을 구현했다.위 동적 쿼리 문제를 구현하기 위해서 JPQL를 사용하여 여러 분기점으로 해결했다.만약 검색 조건이 하나가 더 추가되거나 변경된다면 수정할 수 없을 만큼 복잡한 로직으로 구현된 것이 문제이다.다른 문제점으로, 컨트롤러에서 응답하기 위한 DTO가 레포지토리에서 사용되기 때문에 영속 계층이 컨트롤러, 서비스 계층과 의존하는 문제가 생긴다. 이를 해결하기 위해서 DTO를 계층 별로 분리해야 한다. AS-IS@Repository@RequiredArgsConstructorpublic class FeedRepositoryCustomImpl { private ..

프로젝트 2024.03.14

[소마] OAuth2.0 인증 성공 후, AuthenticationSuccessHandler 테스트해보자

OAuth2.0 인증 성공 후, AuthenticationSuccessHandler 테스트해보자 문제OAuth2.0 인증 프로세스 중, 사용자를 식별하기 위한 토큰을 생성하는 것을 검증하려고 한다.문제는 OAuth2.0는 외부 인증 서버를 사용하고 인증 프로세스 대부분이 짜여진 인터페이스를 구현하는 형태라,외부 인증 서버에서 사용자 인증 성공을 받고 나서의 상황을 테스트에서 어떻게 구현할지 난감했었다. 테스트 대상@RequiredArgsConstructor@Componentpublic class OAuth2SuccessHandler extends SimpleUrlAuthenticationSuccessHandler { private final JwtProvider jwtProvider; @Ove..

프로젝트 2024.02.19

[소마] 스프링에서 리다이렉트했는데 자꾸 로그인 페이지로 넘어갈 때

스프링에서 리다이렉트했는데 자꾸 로그인 페이지로 넘어갈 때 문제OAuth2SuccessHandler에서 프론트에 토큰  값을 전달하기 위해 redirect를 설정했더니 다시 로그인 페이지로 리다이렉트되는 현상 해결현재 OAuth2SuccessHandler 설정@RequiredArgsConstructor@Componentpublic class OAuth2SuccessHandler extends SimpleUrlAuthenticationSuccessHandler { private final JwtProvider jwtProvider; @Override public void onAuthenticationSuccess( HttpServletRequest request, Htt..

프로젝트 2024.01.27

[소마] JWT 검증하기 전에 parsing 해보자

JWT 검증하기 전에 parsing 해보자 문제웹 서비스의 단일 키값으로 서명하는 방식은 하나의 키 유출로 모든 인증 프로세스가 유효하지 않게 된다.이 문제를 개선시키기 위해, 전달할 토큰을 생성하면서 유저에게 고유한 키값을 할당한다. 구현일반적으로 JWS를 검증하기 전에는 Jwts.parser() 메서드를 호출할 수 없으므로 저장한 key id 값을 추출할 수 없다.jjwt에서는 다음과 같은 상황에서 key locator를 권장하고 있다.If you need to support dynamic key lookup when encountering JWTs, you'll need to implement the Locator interface and specify an instance on the JwtPar..

프로젝트 2024.01.26

[소마] jwt 인증 프로세스에서 공통 로직을 분리하자

jwt 인증 프로세스에서 공통 로직을 분리하자 문제토큰 처리에 필요한 util 구현체 TokenProvider의 로직에서 Bearer prefix를 제거하고 validate가 반복된다. AS-IS@Slf4j@RequiredArgsConstructor@Componentpublic class JwtProvider { private final JwtService jwtService; public final static String ISSUER = "side-match"; public final static String HEADER_AUTHORIZATION = "Authorization"; public final static String TOKEN_PRIFIX = "Bearer"; p..

프로젝트 2024.01.26

[소마] 로그인 페이지 서버사이드 mvc 구현에서 endpoint 호출로 수정

로그인 페이지 서버사이드 mvc 구현에서 endpoint 호출로 수정 문제많은 블로그, 유튜브 레퍼런스들이 OAuth2 + JWT를 활용한 로그인 구현에 spring 서버 사이드(mvc) 형태로 해결하고 있다.나도 프로젝트 초반에 레퍼런스를 따라 진행했기 때문에 로그인 플로우를 웹서버에서 백엔드로 넘어오게 설정하였다. 이러한 구조의 문제는 다음과 같다.백엔드로 불필요한 요청이 넘어온다확장성이 떨어지고 다양한 클라이언트를 지원할 수 없다.프론트에서 CDN을 활용해 페이지를 렌더링할 수 없다. 해결@RestControllerpublic class LoginController { @GetMapping("/api/login") public void login(HttpServletResponse res..

프로젝트 2024.01.17

[소마] application.properties 에 노출되면 안되는 값을 암호화하자

application.yml에서 노출되면 안되는 값을 암호화하자 현재 문제 aws 접근키와 oauth의 client-secret같이 중요한 값이 application.yml에서 노출될 수 있다.설정 파일을 이미 git에서 추적하고 있기 때문에 .gitignore에 추가하더라도 여러 개발 환경에서 의도치 않게 공개될 수 있다.멘토와 코드 리뷰를 진행하기 위해서 private repo를 public으로 수정하고 싶었으나, 과거 commit에서 설정 파일에 암호가 노출되기 때문에 수정할 수 없었다. 처음부터 중요한 값들은 암호화하여 저장할 필요가 있다. 해결방안 aws parameter store 서비스를 사용jasypt 라이브러리 사용vault 툴 사용 프로젝트 배포에서 gcp의 프로모션을 사용할 수 있기 ..

프로젝트 2024.01.15

[소마] mysql에 저장할 때, 아이콘, 이모지가 저장 안 되는 문제 해결

mysql에 저장할 때, 아이콘, 이모지가 저장 안 되는 문제 해결  ✅, 🔥 이런 이모지를 글에 저장할 때, UTF-8으로 설정했다면 위와 같은 에러 메세지를 받을 수 있다. 해결방법은 간단하다.AWS RDS의 parameter group(파라미터 그룹)을 변경하면 된다.파라미터 그룹의 편집에 들어가서 character_set으로 검색해서 나온 항목들을 모두utf8 -> utf8mb4 로 수정한다. 그리고 변경 사항 저장을 하기 전에아래처럼 collation으로 검색해서 나온 결과collation_connection, collation_server를 utf8_general_ci -> utf8mb4_unicode_ci 으로 수정한다. RDS 설정을 자동으로 업데이트 하게 해둿다면RDS 데이터베이스에 수..

프로젝트 2023.11.14

[소마] 젠킨스로 CI/CD 구현하기 - (2) 젠킨스 빌드 유도부터 배포 완료

젠킨스 빌드부터 배포 완료 안녕하세요. 이전 포스팅에 이어서 젠킨스로 배포하기 마무리하겠습니다.아래 포스팅을 요약하자면 젠킨스 설치부터 플러그인 설치, Github과 deploy instance 접근 설정을 했습니다. 젠킨스로 CI/CD 구현하기 - (1) 설치부터 배포 ec2와 연결, plugin젠킨스 설치부터 deploy ec2와 연결, plugin 설정 안녕하세요. 오늘은 젠킨스로 CI/CD 구축하겠습니다. 설치부터 ssh로 private repository와 연결, plugin 설치, node js 설정까지 진행하겠습니다. 목표 react와 sprjujemu.tistory.com 1. 백엔드 repository item 등록 Dashboard에서 item 생성으로 들어갑니다. Github repo..

프로젝트 2023.09.29

[소마] 젠킨스로 CI/CD 구현하기 - (1) 설치부터 배포 ec2와 연결, plugin

젠킨스 설치부터 deploy ec2와 연결, plugin 설정 안녕하세요.오늘은 젠킨스로 CI/CD 구축하겠습니다.설치부터 ssh로 private repository와 연결, plugin 설치, node js 설정까지 진행하겠습니다. 목표 react와 spring 기능 구현이 완료되면 Github webhook과 script trigger로 젠킨스 빌드를 유도젠킨스 파이프라인을 사용하지 않고 shell script로 진행 미리보는 회고제가 젠킨스로 CI/CD를 구현하는 과정에서 해결했던 어려움들 입니다. 젠킨스 도커 컨테이너에서 도커를 실행할 때, docker in docker와 docker out of docker의 작동 방식 차이docker in docker 방식으로 실행되지 않은 점npm run b..

프로젝트 2023.09.27