본문 바로가기

백엔드 개발일지

(18)
[Spring] 코드 정적 분석을 위한 SonarCloud 도입기 현재 진행 중인 사이드 프로젝트 모카콩(https://github.com/mocacong/Mocacong-Backend)에는 아직 코드 정적 분석을 위한 도구가 따로 없었습니다. 사실상 MVP 기능들은 다 개발이 되었고 현재는 리팩터링 위주로 진행중인데 현재 프로젝트의 테스트 코드가 꼼꼼히 잘 작성되었는지, 코드에 취약점이 있는지 파악하고 싶어 SonarCloud를 도입하게 되었습니다. 1. SonarCloud란 코드 정적분석기로 이미 SonarQube가 유명합니다. SonarQube는 이미 널리 알려진 문제가 발생하는 코드나 일반적으로 사용되는 규칙을 통해 버그나 취약점을 파악할 수 있고 테스트 코드의 커버리지를 파악해주어 개발자가 소스코드의 품질을 유지할 수 있게 돕습니다. 하지만 SonarQube는..
[Spring/AWS] Pre-Signed Url을 이용하여 S3로 파일 업로드하기 (feat. NCP) 디프만 동아리에서 진행 중인 프로젝트 Bibbi(https://github.com/depromeet/14th-team5-BE)에서는 사용자 프로필이미지/피드 이미지를 업로드할 수 있는 수단이 필요했고 저희 프로젝트에서는 Pre-Signed Url 방식을 채택했습니다. NCP에서 지원한 크레딧으로 ObjectStorage를 생성하여 Pre-Signed Url을 구현했지만 로직은 AWS에 생성한 S3 버킷을 이용해 구현하는 방식과 같습니다. 1. Pre-Signed Url이란 1) 정의 AWS의 공식 문서에 의하면 Pre-Sigend Url(미리 서명된 URL)은 다른 사람이 AWS 보안 자격 증명이나 권한이 없어도 Amazon S3 버킷에 객체를 업로드하도록 허용할 수 있도록 하는 URL입니다. 즉 S3의..
[Spring] Redis를 통한 Refresh Token 도입기 (2) 본 글에서는 기본적인 Redis 설정이 되어있다는 전제 하에 코드 위주로 설명합니다. 전체적인 리프레시 토큰 로직에 대해 참고하고 싶다면 이전 글을 확인해주세요. 자세한 코드는 https://github.com/mocacong/Mocacong-Backend/pull/131 에서 확인할 수 있습니다. 1. Token 객체 @Getter @Builder @AllArgsConstructor @NoArgsConstructor public class Token { @Id private Long id; private String refreshToken; private String accessToken; @TimeToLive(unit = TimeUnit.MILLISECONDS) // 디폴트는 TimeUnit.SECO..
[Spring] Redis를 통한 Refresh Token 도입기 (1) 현재 진행 중인 사이드 프로젝트 모카콩(https://github.com/mocacong/Mocacong-Backend)에서는 기존엔 Access Token 하나만 가지고 로그인 처리를 진행했었습니다. 그러나 유효시간이 짧은 Access Token 특성 상, 빈번하게 로그인 요청을 수행해야 했으며 이는 불편함을 초래하였습니다. 이에 따라 보안적인 측면을 고려하며 로그인 유효시간을 늘릴 수 있는 Refresh Token을 도입하기로 결정했습니다. 1. Refresh Token의 필요성 일반적으로 서비스에서 회원 인증을 위해 많이 사용되는 JWT(Json Web Token) 방식을 모카콩 프로젝트에서도 도입했습니다. 하지만 사용자 인증을 위한 Access Token의 유효시간은 약 30분으로 설정되어 있었습..
[Spring] Code Coverage 측정을 위한 JaCoCo 적용하기 1. JaCoCo란 JaCoCo는 Java code coverage를 측정하는 오픈소스 라이브러리입니다. JaCoCo는 Line, Branch Coverage를 제공하며 테스트를 실행한 후, 결과를 html/csv/xml 파일을 통해 보기 좋게 시각화를 해줍니다. Code Coverage 소프트웨어의 테스트를 논할 때 얼마나 테스트가 충분한가를 나타내는 지표 2. JaCoCo 적용하기 * 해당 포스트에 대한 코드 내용은 여기서 확인할 수 있습니다. (https://github.com/depromeet/14th-team5-BE/pull/7) 개발 환경: SpringBoot 3.1.5, Java 17, Gradle server: 루트 프로젝트 ├── config: 프로젝트 설정 관리 │ ├── build │..
[Spring] 멀티 모듈 프로젝트 도입하기 1. 단일 모듈 프로젝트의 문제점장기 프로젝트의 경우, 시간이 지날수록 기능이 추가되고 무거워집니다. 서비스가 분리된 후에도 도메인이 서로 강하게 결합되어 있는 경우, 도메인의 수정이나 업데이트를 일관되게 유지하는 것이 어렵습니다. 예를 들어 어느 한 쪽에서 도메인을 수정하면 다른 쪽에서도 도메인을 수정해야 합니다. 이 과정에서 어느 한 쪽에서 수정이 되지 않으면 도메인이 달라지는 경우가 생길 수 있으며 결국 프로젝트가 개발자에 대한 의존성이 높아지게 됩니다.   2. 멀티 모듈 프로젝트란?프로그래밍에서 ‘모듈’은 프로그램을 구성하는 시스템을 기능 단위의 독립적인 부분으로 분리한 것을 의미합니다. 다시 말해  독립적으로 배포될 수 있는 코드의 단위입니다. 그리고 하나의 프로젝트 안에 독립적인 모듈을 여러..
[JPA] 코멘트 신고 기능 도입 및 벌크 연산과 배치 작업을 통한 기간 정지 구현 현재 사이드 프로젝트로 진행중인 프로젝트 모카콩(https://github.com/mocacong/Mocacong-Backend)은 부적절한 코멘트에 대해 처리를 하는 신고 기능 로직이 없었습니다. 이후, 커뮤니티 기능도 도입할 예정이기 때문에 아래의 조건에 해당하는 회원에 한해 60일동안 모카콩 서비스에 접근할 수 없도록 기간 정지 기능을 구현했습니다. 5번 이상 신고당한 코멘트 -> 코멘트 내용 마스킹, 코멘트 작성자에게 경고 1회 부여 11번 이상 경고를 받은 유저 -> 60일간 모카콩 서비스 접근 금지 (member의 status가 ACTIVE->INACTIVE) 1. 코멘트 신고 기능 도입 이후 커뮤니티 기능을 확장시킬 예정이기 때문에 신고 기능을 따로 Report 클래스로 두어 구현했습니다. ..
[JPA] 인터셉터를 활용한 JWT Token 기반 로그인 구현 정리 1. 인터셉터1) 인터셉터란?인터셉터(Interceptor)는 스프링 프레임워크에서 요청과 응답을 가로채서 처리하는 기능입니다. 컨트롤러가 호출되기 전에 요청을 가로채서 다양한 처리를 할 수 있습니다.ex) 로그인 체크, 권한 체크, 인코딩 설정, 로깅 등등...이렇게 핸들러(컨트롤러)의 수정없이 핸들러 수행 전/후처리 동작을 추가해 중복되는 코드를 줄이고 코드의 유지보수성 또한 높일 수 있다 2) HandlerInterceptor 인터페이스인터셉터는 HandlerInterceptor 인터페이스를 구현해 작성해야 합니다.HandlerInterceptor 인터페이스에는 다음 3가지 메서드가 정의됩니다.public interface HandlerInterceptor { default boolean pr..