본문 바로가기

Refactoring10

[리뷰레인저] JWT 토큰에 포함된 유저 정보를 제거하자 - 4 해당 게시글은 프로젝트 '리뷰레인저'에 대해 개인 리팩토링 과정을 정리한 시리즈 글입니다. 이번 게시글의 주제는 'JWT 토큰의 Payload에 포함된 유저 정보로 인한 개인정보 유출 위험에 대한 개선안'입니다. 기존 로직의 문제점 위 사진은 JWT 구조를 설명하고 있다. 이 중 내용(payload)에 집중해서 보면 ‘사용자의 권한 정보’와 ‘사용자 데이터’가 들어있음을 알 수 있다 여기서 중요한 것은 아래 주의 문구를 보자 즉, 페이로드에 중요한 값을 넣어두면 누구든 디코딩을 통해 값을 열람할 수 있기 때문에 민감한 정보는 포함하면 안된다는 내용이다. 그렇다면? 지금 나의 코드는 어떠한 정보를 포함한 JWT 토큰을 생성하고 있는지 확인해보자 UserPrincipal은 Spring Security의 Us.. 2024. 4. 13.
[리뷰레인저] 페이징에 사용되는 Slice 도메인 객체의 노출 범위를 조정하자 - 3 해당 게시글은 프로젝트 '리뷰레인저'에 대해 개인 리팩토링 과정을 정리한 시리즈 글입니다. 이번 게시글의 주제는 '페이징에 사용되는 Slice 객체가 외부에 노출되는 현상에 대한 개선안'입니다. 개요 Slice 객체는 spring.data 패키지에 존재하는 것을 바탕으로 리팩토링을 진행하자! (패키지 범주를 잘 생각해보자) 우리가 왜 controller에서 entity를 노출하지 않는가? 외부에 의해 수정될 위험이 있기때문이다 entity는 domain영역이다. 마찬가지로 slice 객체도 domain영역에 존재한다. 그래서 entity 대신에 우리는 Response라는 객체를 만들어 사용한다 이와 똑같은 맥락으로 생각해보면 된다 Slice 객체의 범주 Controller → Service → Repo.. 2024. 4. 12.
[리뷰레인저] DB에 불필요하게 쌓이는 RefreshToken을 해결하자 - 2 해당 게시글은 프로젝트 '리뷰레인저'에 대해 개인 리팩토링 과정을 정리한 시리즈 글입니다. 이번 게시글의 주제는 '유효한 refreshToken뿐만 아니라 무효한 refreshToken까지 DB에 무의미하게 쌓이는 현상에 대한 개선안'입니다. 기존 로직의 문제점 RefreshToken이 불필요하게 DB에 주기적으로 저장되어 문제가 발생했다 지금은 local에서 테스트 한 환경이지만 refreshToken의 유효시간은 24시간으로 만약 사용자가 많아지고 24시간이 지난다면 이러한 불필요한 만료 토큰 데이터가 계속해서 쌓이게 될 것이다 그리고 위 데이터를 보면 알 수 있다싶이 refreshToken이 `user_id`를 가지고 있어야한다 그렇다면 차라리 user가 refreshToken을 가지고 있다면 어떨.. 2024. 4. 10.
[리뷰레인저] 확장성을 해치는 swtich 분기문을 없애자 - 1 해당 게시글은 프로젝트 '리뷰레인저'에 대해 개인 리팩토링 과정을 정리한 시리즈 글입니다. 이번 게시글의 주제는 'swtich문에 의한 로직의 유지보수성, 확장성이 저하되는 현상에 대한 개선안'입니다. 기존 로직의 문제점들 서비스 로직은 이름과 내부를 봤을 때 어떤 기능을 수행하는지 딱 알 수 있어야 한다 위 사진이 내부와 이름으로 어떤 기능을 수행하는지 바로 알 수 있는 예시이다 `getAllFinalReveiwResults` 메소드는 모든 최종 리뷰 결과를 가져오는 메소드 이름 + 유저id와 상태로 모든 최종 리뷰를 가져오는 기능임이 한번에 보인다. 1) 최종 리뷰를 생성하고 조회하는 로직은 어떤 기능을 수행하는지 알기 힘든 문제 위의 사진이 최종 리뷰를 생성하는 로직이다. 하지만 create라는 이.. 2024. 4. 9.
[Git|졸업작품] spring boot로 작업한 뭉키를 다시 돌아보며 (6) - .gitignore을 통해 application 파일 숨기기 6. gitignore을 통해 application.yml 파일에 노출되어 있는 database 계정 정보를 제외시켜야 한다. 개요 spring 프로젝트를 배포할 때 Application 파일이 깃허브와 같이 외부에 유출이 되면 aws 클라우드 서비스 계정과 같은 중요한 정보가 같이 유출되어 과다한 요금이 청구될 수 있다. 이와같은 불상사를 방지하기 위해 gitignore을 통해 Git 버전 관리에서 반드시 제외해야 한다. 설정방법 .gitignore 파일에 깃허브에 올리고싶지 않은 파일명을 작성해준다. 작성자는 application 파일을 yml 형식으로 작성하고 있으므로 yml 확장자로 작성하였다. 이후 git에 commit & push를 진행해주면 된다. * .gitignore를 수정하고 커밋 & .. 2023. 3. 27.
[졸업작품] spring boot로 작업한 뭉키를 다시 돌아보며 (5) - Entity의 1:N 매핑의 성능 하락 5. Entity에서 1:N 매핑을 사용하여 이는 연관관계 관리를 위해 추가로 UPDATE SQL이 실행되어 성능 하락을 야기 부제: JPA (1) N+1 문제 N+1문제란 1:N관계에서 1번의 쿼리를 날렸는데 추가로 N번의 쿼리가 더 발생하는 상황이다. 예를들어, 고객 한명(1)이 여러 개의 계좌(N)을 가졌을 때를 가정한다. 이때, 고객의 정보를 조회하면 연관 관계를 갖고있는 여러 개의 계좌정보들까지 N번 조회되는 경우가 발생한다. * 또한, 1:N매핑을 사용하면 DB에 대한 쿼리가 복잡해진다. 매핑된 엔티티들을 로딩하기 위해선 join을 사용해야 하는데 join은 성능 저하의 주요 원인이 된다. N+1문제는 N:1, 1:N 관계에서 발생한다. (2) 1:N매핑에서의 UPDATE SQL 문제 1:N .. 2023. 3. 26.
[졸업작품] spring boot로 작업한 뭉키를 다시 돌아보며 (4) - Entity의 무분별한 Setter 사용의 문제점 3. Entity에서 Setter를 사용하게 되면 객체의 일관성을 보장하기 어려움 (1) 데이터 무결성, 일관성 저해 Entity 클래스는 데이터를 나타내는 클래스로 사용된다. 이 클래스에는 데이터베이스 테이블 열과 대응되는 필드들이 포함된다. 이러한 필드들은 private로 선언되어 외부에서 직접적으로 접근이 불가능하도록 하였으나 public으로 선언된 getter와 setter 메서드를 통해 이 필드에 접근할 수 있게 한다. 그러나, setter를 무분별하게 사용하게 된다면 데이터의 무결성이 깨질 수 있다. 예를 들어, Entity의 필드 중 하나가 null일 수 있다면 setter를 이용해 해당 필드에 null 값을 할당하면 데이터 무결성이 깨진다. (데이터 무결성 중 개체 무결성) Entity 필.. 2023. 3. 22.
[졸업작품] spring boot로 작업한 뭉키를 다시 돌아보며 (3) - 트랜잭션의 readonly 옵션 2. Service에서 데이터를 가져오는 트랜잭션인 경우 readonly = true 옵션을 붙여야 영속성 컨텍스트가 변경 감지를 하지 않아 성능 향상 (1) Spring에서의 트랜잭션 처리 스프링 부트에서는 @Transactional 어노테이션을 사용하여 트랜잭션 처리를 할 수 있다. @Transactional이 적용되어 있을 경우, 해당 클래스에 트랜잭션 기능이 적용된 프록시 객체가 생성된다. 이 프록시 객체는 @Transactioanl이 포함된 메소드가 호출 될 경우 PlatformTransactionManager를 사용하여 트랜잭션을 시작하고 정상 여부에 따라 Commit 또는 Rollback 한다. 정상 여부는 RuntimeException 발생 유무 기준으로 결정되며 RuntimeExcepti.. 2023. 3. 1.
[졸업작품] spring boot로 작업한 뭉키를 다시 돌아보며 (2) - REST API 설계 규칙 1. Rest API 설계 규칙을 지키지 않은 점. Rest API 설계 규칙을 다시 돌아보자 Rest란 Representational State Transfer의 약어로 클라이언트와 서버가 데이터를 주고 받는 방식에 대한 아키텍처 스타일이다. Rest에는 여섯 가지 기본 원칙이 있고 이 가이드를 준수한 인터페이스는 Restful하다고 표현한다. Stateless (무상태성) 서버는 Response cache-control 헤더에 해당 요청의 캐싱 가능 여부를 제공해야 한다. 이를 제공한다면 클라이언트는 Response를 캐싱하여 서버와 클라이언트 간의 상호작용을 줄이고 성능과 서버 가용성을 늘릴 수 있다. Uniform interface (일관된 인터페이스) 보편적인 소프트웨어 엔지니어링 원칙을 com.. 2023. 2. 10.